根据条件将值从行复制到另一个数据帧

Copy values to another dataframe from row based on condition

提问人:Prmake 提问时间:11/13/2023 最后编辑:Prmake 更新时间:11/13/2023 访问量:58

问:

在我的数据帧 (df) 中,我需要:

  • 对于“A 列”中的值 == 是的所有行
  • “B 列”中的值应为:
    • 数据框 'df2' 中 'Column E' 的值 'df2' 其中 'df2' 'Column D' == 'df' 'Column C'

目前我有这个:

df.loc[df['Column A'] == 'Yes', 'Column B'] = df2.loc[(df2['Column D'] == df['Column C']), 'Column E']

但是,这会导致:

ValueError: Can only compare identically-labeled Series objects

我的数据帧示例:

df:
Column A   Column B   Column C
Yes                   2554072
No                    2557766
No                    261191
Yes                   2600355
Yes                   2601388
...                   ...

df2:
Column D  Column E
2554072   8
2601388   4
2604142   6
...       

Required results:
df:
Column A   Column B   Column C
Yes        8          2554072
No                    2557766
No                    261191
Yes        NoMatch    2600355
Yes        4          2601388
...                   ...

我试图将所有这些列中的值更改为字符串并在 C 列中填充 NaN 值,但是 ValueError 是持久的。有什么建议吗?

Python 熊猫

评论

3赞 mozway 11/13/2023
提供数据帧的最小可重现输入,以及匹配的预期输出

答:

1赞 mozway 11/13/2023 #1

您可以使用以下位置进行映射和遮罩:

df['Column B'] = (df['Column C']
                  .map(df2.set_index('Column D')['Column E'])
                  .where(df['Column A'].eq('Yes'))
                 )

或者,使用布尔索引

m = df['Column A'].eq('Yes')
df.loc[m, 'Column B'] =  (df.loc[m, 'Column C']
                          .map(df2.set_index('Column D')['Column E'])
                         )

例:

# df
  Column A Column C
0      Yes        A
1       No        B
2      Yes        C
3       No        D
4      Yes        E
5       No        F

# df2
  Column D  Column E
0        D         0
1        E         1
2        F         2
3        A         3
4        B         4
5        C         5

# Output
  Column A Column C  Column B
0      Yes        A       3.0
1       No        B       NaN
2      Yes        C       5.0
3       No        D       NaN
4      Yes        E       1.0
5       No        F       NaN
0赞 user_stack_overflow 11/13/2023 #2

这也适用于:

output_df= pd.merge(df, df2,  left_on='Column C', right_on='Column D', how='left')

output_df['Column B'] = result_df.apply(lambda row: row['Column E'] if 
row['Column A'] == 'yes' else row['Column B'], axis=1)