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数据框架来做这件事?

Ben Hardy 提问于2022-03-13
两个数据框的行数是否相同?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
TheFaultInOurStars 提问于2022-03-13
有一个问题--我们怎样才能得到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
SergFSM 提问于2022-03-13
谢谢你的解答,ID列不是索引,因为我将在一些行中重复相同的ID。Ben Hardy 2022-03-14