[英]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"
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.