Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python可以从其他列按条件替换更改的单元格值_Python 3.x_Pandas_Pandas Groupby_Transform_Apply - Fatal编程技术网

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。工作起来很有魅力。多谢各位。