【问题标题】:Python pandas replacing changing cell value by condition from other columnPython pandas 通过其他列的条件替换更改单元格值
【发布时间】:2021-03-29 22:28:26
【问题描述】:

我有一个数据框:

df = pd.DataFrame({'cust': {0: 'A',
  1: 'A',
  2: 'A',
  3: 'A',
  4: 'B',
  5: 'B',
  6: 'B',
  7: 'B',
  8: 'B'},
 'value': {0: 6, 1: 10, 2: 11, 3: 15, 4: 6, 5: 12, 6: 21, 7: 29, 8: 33},
 'signal': {0: 0, 1: 1, 2: 1, 3: 0, 4: 1, 5: 0, 6: 0, 7: 0, 8: 0}})


  cust  value  signal
0    A      6       0
1    A     10       1
2    A     11       1
3    A     15       0
4    B      6       1
5    B     12       0
6    B     21       0
7    B     29       0
8    B     33       0

当 signal != 0 时,我应该将“value”替换为每个客户之前的值。 例如,在索引为 1 的行中,值 = 10 应替换为其先前的值,即 6。 在索引为 4 的行中,我无法将值 6 替换为其先前的值,因为客户“B”没有先前的值。在这种情况下,我应该将 value 替换为 0。

由于我有一个包含 5000 万行的数据框,如何以最高效的方式做到这一点?

【问题讨论】:

    标签: python-3.x pandas pandas-groupby transform apply


    【解决方案1】:

    IIUC,您可以使用 groupby(在 cust 列上)transform 使用 shift,fillna,然后使用 np.where 选择适当的值:

    # find previous value from each customer group
    res = df.groupby('cust')['value'].transform('shift').fillna(0)
    
    # replace values
    df['value'] = np.where(df['signal'].ne(0), res, df['value'])
    
    print(df)
    

    输出

      cust  value  signal
    0    A    6.0       0
    1    A    6.0       1
    2    A   10.0       1
    3    A   15.0       0
    4    B    0.0       1
    5    B   12.0       0
    6    B   21.0       0
    7    B   29.0       0
    8    B   33.0       0
    

    更新

    如果您需要传播最后一个有效值,请执行以下操作:

    # make invalid values na, to use ffill
    df['value'] = np.where(df['signal'].ne(0), np.nan, df['value'])
    
    # use ffill, for values at the beginning of the group fillna(0)
    df['value'] = df.groupby('cust')['value'].transform('ffill').fillna(0)
    
    print(df)
    

    输出

      cust  value  signal
    0    A    6.0       0
    1    A    6.0       1
    2    A    6.0       1
    3    A   15.0       0
    4    B    0.0       1
    5    B   12.0       0
    6    B   21.0       0
    7    B   29.0       0
    8    B   33.0       0
    

    【讨论】:

    • 伙计,你是冠军。尊重!
    • 就是这样。非常感谢。
    • 有个小问题。索引 = 2 的行有一个新值设置为 10,但它应该设置为 6,因为 6 是前一行的值(也已更改)。
    • 我在等人来回答。谢谢 Dani,我学会了如何解决这些问题。
    • 就是丹妮。像魅力一样工作。非常非常感谢你。 ?
    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 2019-02-12
    • 2020-12-12
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多