簡體   English   中英

使用兩個條件比較來自兩個不同數據框的兩列

[英]Compare two columns from two different data frame with two conditions

這里的上下文是我正在比較兩列的值——鍵和日期。 如果滿足條件,我們現在將創建一個新列,其中 flag = Y else ""

條件:如果鍵匹配並且 df1 中的日期 > df2 中的日期則“Y”否則“”

因此,我們將遍歷 df1 中的所有行並查看鍵是否與 df2 中的匹配,此時我們將檢查該行的 dateF 和 date 以查看它是否更大,如果是,我們將保存“Y”在新的列標志中。

更新 1:df1 中可以有多個具有相同鍵和不同日期的行

DF1:

鑰匙 日期 其他
123 2022-03-04 蘋果
321 2022-05-01 紅色的
234 2022-07-08 綠色的

DF2:

鑰匙 日期
123 2022-03-01
321 2022-05-01
234 2022-07-01

預期的 O/P: 解釋:正如我們所見,第一行和第三行鍵是匹配的,df1 中的 DateF > df2 中的日期,所以 Y

鑰匙 日期 其他 旗幟
123 2022-03-04 蘋果
321 2022-05-01 紅色的
234 2022-07-08 綠色的

創建所有dfs的代碼:

import pandas as pd

data = [[123, pd.to_datetime('2022-03-04 '),'Apple'],
[321, pd.to_datetime('2022-05-01 '),'Red'],
[234, pd.to_datetime('2022-07-08 '),'Green']]
df1 = pd.DataFrame(data, columns=['Key', 'DateF', 'Another'])

#df2
data1 = [[123, pd.to_datetime('2022-03-01 ')],
[321, pd.to_datetime('2022-05-01 ')],
[234, pd.to_datetime('2022-07-01 ')]]
df2 = pd.DataFrame(data1, columns=['Key', 'Date'])

試過這個,但我想我錯了。

for i in df1.Key.unique():
   df1.loc[(df1[i] == df2[i]) & (r['DateF'] > df2['Date]), "Flag"] = "Y"

謝謝你!

您可以使用pandas.Series.gt比較兩個日期,然后使用pandas.DataFrame.loc和 boolean 掩碼來創建新列並同時對其進行標記。

df1.loc[df1['Date'].gt(df2['Date']), "Flag"]= "Y"

#Output:

print(df1)

   Key       Date Another Flag
0  123 2022-03-04   Apple    Y
1  321 2022-05-01     Red  NaN
2  234 2022-07-08   Green    Y

如果您的數據框大小不同,則可以使用合並:

final=df1.merge(df2,left_on='Key',right_on='Key',how='left')
final.loc[final['DateF'] > final['Date'], "Flag"]="Y"
final=final.drop(['Date'],axis=1)

    Key DateF   Another Flag
0   123 2022-03-04  Apple   Y
1   321 2022-05-01  Red 
2   234 2022-07-08  Green   Y

這段代碼不像答案那么優雅,但它也有效:

ref_dates   = dict(zip(df2.Key,df2.Date))
df1['Flag'] = ['Y' if date>ref_dates.get(key,'0000-00-00') else '' for key,date in zip(df1.Key,df1.DateF)]

我們首先用df2中的日期創建一個字典 ( ref_dates ),然后遍歷df1將它們與DateF進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM