Python Pandas - 如何将数据框两列的值与另一个数据框列进行比较?
回答 2
浏览 8332
2022-03-13
我有两个数据框,我需要根据条件在两列之间进行比较并打印输出。比如说。
df1:
| ID | Date | value |
| 248 | 2021-10-30| 4.5 |
| 249 | 2021-09-21| 5.0 |
| 100 | 2021-02-01| 3,2 |
df2:
| ID | Date | value |
| 245 | 2021-12-14| 4.5 |
| 246 | 2021-09-21| 5.0 |
| 247 | 2021-10-30| 3,2 |
| 248 | 2021-10-30| 3,1 |
| 249 | 2021-10-30| 2,2 |
| 250 | 2021-10-30| 6,3 |
| 251 | 2021-10-30| 9,1 |
| 252 | 2021-10-30| 2,0 |
我想写一段代码,比较两个数据框架之间的ID列和日期列,其条件如下:。
如果"ID和日期从df1到df2是匹配的": print(df1['compare'] = 'Both matching')
如果"ID是匹配的,而日期从df1到df2不匹配": print(df1['compare'] = 'Date not matching')
如果“ID 从 df1 到 df2 不匹配”:print(df1['compare'] = 'ID not available')
我的结果df1
应该是下面的样子。
df1(预期结果)。
| ID | Date | value | compare
| 248 | 2021-10-30| 4.5 | Both matching
| 249 | 2021-09-21| 5.0 | Id matching - Date not matching
| 100 | 2021-02-01| 3,2 | Id not available
如何用Python的pandas数据框架来做这件事?
两个数据框的行数是否相同?
- Ashutosh sharma 2022-03-13
print(df1['compare'] = 'Both matching')
的意思是什么?
- TheFaultInOurStars 2022-03-13
@Ashutosh sharma,不,不会的。Df1会有较少的行,DF2会有大约1000行。
- Ben Hardy 2022-03-13
@Amirhossein Kiani, 我想在df1中添加另一列,并添加数值,说明这些数值是否匹配,是否不匹配。
- Ben Hardy 2022-03-13
2 个回答
#1楼
已采纳
得票数 3
我建议你做的是使用iterrows
。这可能不是最好的主意,但仍然可以解决你的问题。
compareColumn = []
for index, row in df1.iterrows():
df2Row = df2[df2["ID"] == row["ID"]]
if df2Row.shape[0] == 0:
compareColumn.append("ID not available")
else:
check = False
for jndex, row2 in df2Row.iterrows():
if row2["Date"] == row["Date"]:
compareColumn.append("Both matching")
check = True
break
if check == False:
compareColumn.append("Date not matching")
df1["compare"] = compareColumn
df1
输出量
ID | Date | value | compare | |
---|---|---|---|---|
0 | 248 | 2021-10-30 | 4.5 | Both matching |
1 | 249 | 2021-09-21 | 5 | Date not matching |
2 | 100 | 2021-02-01 | 3.2 | ID not available |
有一个问题--我们怎样才能得到df2的索引值,以获得与之匹配的两行?
- Ben Hardy 2022-03-14
@BenHardy 你可以简单地使用。
df[df1["compare"] == "Both matching"]
- TheFaultInOurStars 2022-03-14
@ Amirhossein Kiani - 我想从df2返回索引。比方说,如果df2中的两条匹配行的索引都是5,我想返回的值是5。
- Ben Hardy 2022-03-14
@BenHardy 谢谢你的评论,Ben。如果你确定你的数据框架有一个索引,你可以使用。
df.index = df.index.set_names(['my_index'])
,然后df.reset_index(inplace=True)
,然后你可以简单地使用。df1[df1["compare"] == "Both matching"]["my_index"]
- TheFaultInOurStars 2022-03-14
#2楼
得票数 1
假设'ID'列是索引,那么我们就可以这样做了。
def f(x):
if x.name in df2.index:
return 'Both matching' if x['Date']==df2.loc[x.name,'Date'] else 'Date not matching'
return 'ID not available'
df1 = df1.assign(compare=df1.apply(f,1))
print(df1)
Date value compare
ID
248 2021-10-30 4.5 Both matching
249 2021-09-21 5.0 Date not matching
100 2021-02-01 3,2 ID not available
谢谢你的解答,ID列不是索引,因为我将在一些行中重复相同的ID。
- Ben Hardy 2022-03-14