鉴于这些数据框...:
DF = pd.DataFrame({'COL1': ['A', 'B', 'C', 'D','D','D'],
'COL2': [11032, 1960, 11400, 11355, 8, 7],
'year': ['2016', '2017', '2018', '2019', '2020', '2021']})
DF
COL1 COL2 year
0 A 11032 2016
1 B 1960 2017
2 C 11400 2018
3 D 11355 2019
4 D 8 2020
5 D 7 2021
DF2 = pd.DataFrame({'ColX': ['D'], 'ColY':['2021'], 'ColZ':[100]
DF2
ColX ColY ColZ
0 D 2021 100
如果满足以下条件:
COL1 = 来自 DF2 的 ColX
年份 = 来自 DF2 的 ColY
然后将 COL2 中的值从 DF2 更改为 ColZ。
最佳答案
您似乎想要使用 DF2
中的数据更新
DF
。
假设 DF2
中的所有值对于 ColX
和 ColY
中给定的一对值都是唯一的:
DF = DF.merge(DF2.set_index(['ColX', 'ColY'])[['ColZ']],
how='left',
left_on=['COL1', 'year'],
right_index=True)
DF.COL2.update(DF.ColZ)
del DF['ColZ']
>>> DF
COL1 COL2 year
0 A 11032 2016
1 B 1960 2017
2 C 11400 2018
3 D 11355 2019
4 D 8 2020
5 D 100 2021
我将一个临时数据框 (DF2.set_index(['ColX', 'ColY'])[['ColZ']]
) 合并到 DF 中,这会添加 ColZ 中的所有值,其中索引(ColX
和 ColY
)与 DF
中的 COL1
和 year
的值匹配。所有不匹配的值都用 NA
填充。
然后,我使用 update
从 DF.ColZ 中的非空值覆盖 DF.COL2
中的值。
然后我删除 DF['ColZ'] 进行清理。
如果 ColZ
与 DF
中的现有列名称匹配,那么您需要进行一些调整。
替代解决方案如下:
DF = DF.set_index(['COL1', 'year']).update(DF2.set_index(['ColX', 'ColY']))
DF.reset_index(inplace=True)
输出与上面相同。
关于Python pandas 根据列值条件替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33029505/