【问题标题】:conditional replace based off prior value in same column of pandas dataframe python基于pandas数据框python同一列中的先验值的条件替换
【发布时间】:2015-06-16 20:08:38
【问题描述】:

感觉好像我几乎到处都看过,我知道这可能非常简单。我正在使用 pandas 数据框,并希望根据该 SAME 列中的数据填充/替换其中一列中的数据。我通常更像是一个 excel 用户,它在 excel 中非常简单。如果我们有:

df = pd.DataFrame([0, -1, -1, -1, 0 , 0, 0, 1, 0])
df.columns = ['A']
df['B'] = df['A']

在 excel 中我想要做的是“ =IF(AND(A2=0, B1=-1), -1, A2) 这样我就可以向下拖动列 'B' 并且这将适用.本质上是基于B列的先验数据点,以及A列的当前值,我需要更新B列的当前值。

我试过了:

df['B'] = np.where((df['A'] == 0), (df['B'].shift(1) == -1),
                   df['B'].replace(to_value = 0, method = 'ffill'), df['A'])

还有很多其他版本,以及 iterrows 的变体和其他令人难以置信的极端解决方法,但无济于事。

非常感谢任何建议。

编辑:

结果是:

df['B'] = [0, -1, -1, -1, -1 , -1, -1, 1, 0]

【问题讨论】:

  • 在您的问题中,解决方案中的特定值可能取决于原始系列的许多不同值,而不仅仅是先前的值。所以像 mishaF 的解决方案这样的循环可能是要走的路。在您尝试 df['B'] 的值时,最后一次全部替换,而不是一个接一个。

标签: python pandas replace fill calculated-columns


【解决方案1】:

这是一种蛮力方法。可能有一些更优雅的东西,但你可以像这样显式地循环遍历行:

df = pd.DataFrame([0, -1, -1, -1, 0 , 0, 0, 1, 0])
df.columns = ['A']
df['B'] = df['A']

# loop here
for i in range(1,len(df)):
     if df.A[i] == 0 and df.B[i-1] == -1:
             df.B[i] = -1
     else:
             df.B[i] = df.A[i]

这会给你你想要的结果:

>>> df['B']
0    0
1   -1
2   -1
3   -1
4   -1
5   -1
6   -1
7    1
8    0

【讨论】:

    【解决方案2】:

    在哪里使用

    df['B'] = df.A[0:len(df.A)-1].where((df.A==0 ) & (df.B.shift(-1)==-1),-1)
    df['B'] = df['B'].fillna(df.A)
    

    【讨论】:

      猜你喜欢
      • 2018-01-05
      • 2022-09-23
      • 2021-12-13
      • 1970-01-01
      • 2018-03-27
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多