【问题标题】:copy row values based on result from isin() in pandas根据熊猫中 isin() 的结果复制行值
【发布时间】:2017-01-25 19:20:59
【问题描述】:

我有 2 个数据框:

df_a = pd.DataFrame({'A':[1,2,3,4],'B':[4,5,6,7],'ID':['a','b','c','d']})
df_a    
   A  B ID
0  1  4  a
1  2  5  b 
2  3  6  c
3  4  7  d
df_b = pd.DataFrame({'A':[1,2,3],'ID':['b','a','c']})
df_b['CopyB'] = ""
    A   ID  CopyB
0   1   b   
1   2   a   
2   3   c   

现在我想匹配两个数据帧中的 ID 列,并且在成功匹配后,我想将 B 的相应值从 df_a 复制到 df_b['CopyB']。我试过df_b.loc[df_b['ID'].isin(df_a['ID']),'Copy']= df_a['B] 但这是不正确的。然后我尝试使用 '==' 比较 ID,但由于 ID 系列的长度不相等而出现错误。有什么帮助吗?对不起,如果这是一个非常琐碎的查询。

【问题讨论】:

  • 你的预期输出是什么?

标签: python python-2.7 python-3.x pandas dataframe


【解决方案1】:

使用join

df_b.join(df_a.set_index('ID').B, on='ID')

   A ID  B
0  1  b  5
1  2  a  4
2  3  c  6

join 适用于索引。所以我将df_a 的索引设置为ID 列并访问B 列,以便df_a.set_index('ID').B 是一个系列,其中包含我要添加为值的列和合并列作为索引。然后我使用join。如果IDdf_b 的索引,我就不必指定on 参数,但它不是,所以我这样做了。

【讨论】:

  • @sacmax 不要忘记用绿色复选标记将其标记为答案。
【解决方案2】:

你可以使用merge

In [247]: df_b.merge(df_a, on=['ID'])
Out[247]:
   A_x ID  A_y  B
0    1  b    2  5
1    2  a    1  4
2    3  c    3  6

In [248]: df_b.merge(df_a, on=['ID'])[['A_x', 'ID', 'B']].rename(columns={'A_x': 'A'})
Out[248]:
   A ID  B
0  1  b  5
1  2  a  4
2  3  c  6

【讨论】:

  • 谢谢约翰。真的很有帮助。
【解决方案3】:

如果您将 ID 列设置为两个数据框的公共索​​引,则可以轻松添加该列:

df_a = df_a.set_index('ID')
df_b = db_b.set_index('ID')

df_b['Copy B'] = df_a['B']

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 2022-11-15
    • 2022-01-01
    • 2015-11-07
    • 2022-11-16
    • 2018-09-05
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多