繁体   English   中英

Pandas:根据相同的列值但不同的行和条件更新某些列值

[英]Pandas: Update certain column values based on same column value but different rows and condition

我正在使用 Python 3.6 和 Pandas 0.25。

我有以下数据框:

import collections
import datetime
import pandas as pd
import numpy as np

data = {
    'col1_data': ['A1', 'A1', 'A1', 'A2', 'A2'],
    'col2_data': ['UNMAPPED', 'UNMAPPED', 'GOOD VALUE', 'UNMAPPED', 'CORRECT VALUE']
}

df = pd.DataFrame(data)

它看起来像下面:

display(df)

数据前

基本上,我想将 col1_data 中所有“A1”的“col2_data”值更新为“Good Value”,并将 col1_data 中所有“A2”的“Correct Value”更新为“Good Value”。

基本上我希望数据框看起来像:

数据后

基本上,我需要根据组(col1_data 值)进行数据更新,但没有聚合,即我不想减少行数。 因此,如果有 3 行具有相同的值(A1),则所有三行在 col2_data(GOOD VALUE)中都应该具有相同的值,或者不等于“UNMAPPED”。

有人可以在这里帮忙吗?

更新 1: UNMAPPED 值不以任何固定顺序出现。 Scot 的解决方案适用于 2 列 DF。 但是,DF有多个列(分组或检查不需要); 分组仅依赖于 col1_data。 我们如何在 DF 中保留其他列?

例如

data = {
    'col1_data': ['A1', 'A1', 'A1', 'A2', 'A2'],
    'col2_data': ['UNMAPPED', 'UNMAPPED', 'GOOD VALUE', 'UNMAPPED', 'CORRECT VALUE'],
    'col3_data': ['B1', 'B2', 'B1', 'B3', 'B4']
}

df = pd.DataFrame(data)

新输入

预期输出:

预期输出

此外,如果根据上述逻辑添加新的派生列更容易,那就没问题了。

如果“正确”字符串始终是组中的最后一个,那么您可以用 np.nan 和 bfill 替换或屏蔽“UNMAPPED”。

df.replace('UNMAPPED', np.nan).bfill()

输出:

  col1_data      col2_data
0        A1     GOOD VALUE
1        A1     GOOD VALUE
2        A1     GOOD VALUE
3        A2  CORRECT VALUE
4        A2  CORRECT VALUE

在这种情况下有效。 或者,如果它是组中的第一个,那么您可以使用ffill()

如果它出现在组中的任何位置,则您可以使用:

df['col2_data'] = df[['col2_data']].replace('UNMAPPED', np.nan).groupby('col1_data')['col2_data']\
  .transform(lambda x: x.ffill().bfill())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM