繁体   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