基于 pandas 数据框 python 同一列中的先验值的条件替换
conditional replace based off prior value in same column of pandas dataframe python
感觉我几乎到处都看了,我知道它可能很简单。我正在使用 pandas 数据框,并根据同一列中的数据查看其中一列中的 fill/replace 数据。我通常更像是一个 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]
这是一种蛮力方法。可能有更优雅的东西,但你可以像这样显式循环行:
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
使用哪里
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)
感觉我几乎到处都看了,我知道它可能很简单。我正在使用 pandas 数据框,并根据同一列中的数据查看其中一列中的 fill/replace 数据。我通常更像是一个 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]
这是一种蛮力方法。可能有更优雅的东西,但你可以像这样显式循环行:
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
使用哪里
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)