Python 3.x Python可以从其他列按条件替换更改的单元格值
我有一个数据帧:Python 3.x Python可以从其他列按条件替换更改的单元格值,python-3.x,pandas,pandas-groupby,transform,apply,Python 3.x,Pandas,Pandas Groupby,Transform,Apply,我有一个数据帧: 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:
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
什么时候发信号!=0对于每个客户,我应该用以前的值替换“值”。
例如,在索引为1的行中,value=10应替换为其以前的值,即6。
在索引为4的行中,我无法将值6替换为其以前的值,因为客户“B”没有以前的值。在这种情况下,我应该将值替换为0
如何以最高效的方式实现这一点,因为我有一个5000万行的数据帧?IIUC,您可以使用shift键(在cust列上)选择适当的值:
输出
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
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
更新
如果需要传播最后一个有效值,请执行以下操作:
# 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 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
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
IIUC,您可以使用shift(在cust列上),然后使用以下选项选择适当的值:
输出
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
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
更新
如果需要传播最后一个有效值,请执行以下操作:
# 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 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
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我学会了如何解决这些问题就是Dani。工作起来很有魅力。多谢各位。伙计,你是冠军。尊敬!就是这样。非常感谢,有个小问题。索引为2的行的新值设置为10,但它应该设置为6,因为6是前一行的值(这也已更改)。我正在等待有人回答它。谢谢Dani我学会了如何解决这些问题就是Dani。工作起来很有魅力。多谢各位。