提问人:Prmake 提问时间:11/13/2023 最后编辑:Prmake 更新时间:11/13/2023 访问量:58
根据条件将值从行复制到另一个数据帧
Copy values to another dataframe from row based on condition
问:
在我的数据帧 (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 是持久的。有什么建议吗?
答:
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)
评论