【问题标题】:Adding a new column to a Pandas DataFrame by comparing two columns to two similar columns in a different Dataframe通过将两列与不同 Dataframe 中的两个相似列进行比较,向 Pandas DataFrame 添加新列
【发布时间】:2021-06-07 17:39:09
【问题描述】:

我想通过获取其中两列中的值并将它们与在不同数据框中以相同顺序出现的值进行比较,从而向 Pandas DataFrame 添加一个新列。

例子:

first_names = pd.Series(['john','jack','jean','jose'])
last_names = pd.Series(['bob','steve','carl','anthony'])

names1 = pd.DataFrame({'firstname': first_names, 'lastname':last_names})
names2 = pd.DataFrame({'firstname': first_names,"lastname":['bob','steve','carl','joshua']})

    firstname   lastname
0   john    bob
1   jack    steve
2   jean    carl
3   jose    anthony


    firstname   lastname
0   john    bob
1   jack    steve
2   jean    carl
3   jose    joshua

如果名字和姓氏组合在 names1 中,我想将“real”列添加到 names2 并用 True 填充,否则用 False 填充。

这是我的尝试:

def verify(first,last):
  if names1.loc[ (names1['firstname'].str.contains(first)) & (names1['lastname'].str.contains(last)) , ['firstname','lastname'] ].empty:
    return False
  else:
    return True

names2['real'] = verify(names2['firstname'], names2['lastname']))

我得到了令人沮丧的错误: TypeError: 'Series' objects are mutable, thus they cannot be hashed 它似乎被抛出在函数 verify 内的以下行:

names1.loc[ (names1['firstname'].str.contains(first)) & (names1['lastname'].str.contains(last)) , ['firstname','lastname'] ].empty:

虽然在直接值时调用函数时它可以正常工作:

verify('jose','anthony')

返回True

这让我觉得这些值不是作为字符串传递的

如何正确地将值传递给上述函数? 是否有更直接的方法来完成比较?

编辑:我忘了提到我的数据框的大小不匹配。 datafaname names2 的行数比 names1 多。使用 names1 保存查找数据并充当检查真假名字和姓氏组合的参考。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以使用两个数据框之间的叉积构造"real" 列,然后合并回names1

    tmp = names1.merge(names2, how="cross")
    tmp["real"] = (tmp["firstname_x"] == tmp["firstname_y"]) & (
        tmp["lastname_x"] == tmp["lastname_y"]
    )
    df_out = names1.merge(
        tmp[tmp["real"] == True],
        left_on=["firstname", "lastname"],
        right_on=["firstname_x", "lastname_x"],
        how="left",
    ).fillna(False)[["firstname", "lastname", "real"]]
    print(df_out)
    

    打印:

      firstname lastname   real
    0      john      bob   True
    1      jack    steve   True
    2      jean     carl   True
    3      jose  anthony  False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 2018-08-26
      • 1970-01-01
      • 2016-05-01
      • 2019-06-06
      相关资源
      最近更新 更多