Python pandas 根据列值条件替换字符串

标签 python pandas

鉴于这些数据框...:

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 中的所有值对于 ColXColY 中给定的一对值都是唯一的:

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 中的所有值,其中索引(ColXColY)与 DF 中的 COL1year 的值匹配。所有不匹配的值都用 NA 填充。

然后,我使用 update 从 DF.ColZ 中的非空值覆盖 DF.COL2 中的值。

然后我删除 DF['ColZ'] 进行清理。

如果 ColZDF 中的现有列名称匹配,那么您需要进行一些调整。

替代解决方案如下:

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/

相关文章:

python - 用pytest创建动态参数?

python - 如何将时间戳转换为可读值? [ Pandas 数据框]

python - 仅 pandas datetime 列的时间分量的平均值

python - 作业有什么问题

python - 使用正则表达式从另一个列表中选择列表

python - 在 dataclasses.field 中使用显式 __init__ 构造函数和 default_factory 参数时缺少数据类属性

Python 2.7-将函数应用于 pandas 数据框的 2 列的最快方法

python - 如何在python中连接和转置两个表

python - pandas.to_csv() 一些单词为粗体

python - 将 panda 中具有相同数据框(切片)的数据框分开