Python 如何为dataframe的某些选定行集体设置多列的值?

Python 如何为dataframe的某些选定行集体设置多列的值?,python,pandas,Python,Pandas,我有一个数据帧df,它有'TPrice'、'high'、'TLow'、'TOpen'、'TClose'、'TPCLOSE'列,现在我想为'TPrice'、'high'、'TLow'、'TOpen'、'TClose'列值为零的行设置'TPCLOSE'列的值 显示TPrice为0的某些行: >>> df[df['TPrice']==0][['TPrice','THigh','TLow','TOpen','TClose','TPCLOSE']][0:5] TPrice TH

我有一个数据帧
df
,它有
'TPrice'、'high'、'TLow'、'TOpen'、'TClose'、'TPCLOSE'
列,现在我想为
'TPrice'、'high'、'TLow'、'TOpen'、'TClose'
列值为零的行设置
'TPCLOSE'
列的值

显示TPrice为0的某些行:

>>> df[df['TPrice']==0][['TPrice','THigh','TLow','TOpen','TClose','TPCLOSE']][0:5]
    TPrice  THigh  TLow  TOpen  TClose  TPCLOSE
13       0      0     0      0       0     4.19
19       0      0     0      0       0     7.74
32       0      0     0      0       0     3.27
43       0      0     0      0       0    12.98
60       0      0     0      0       0     7.48
然后分配:

>>> df[df['TPrice']==0][['TPrice','THigh','TLow','TOpen','TClose']] = df['TPCLOSE']
但是Pandas并没有真正改变df,因为下面的代码仍然可以找到一些行:

>>> df[df['TPrice']==0][['TPrice','THigh','TLow','TOpen','TClose','TPCLOSE']][0:5]
    TPrice  THigh  TLow  TOpen  TClose  TPCLOSE
13       0      0     0      0       0     4.19
19       0      0     0      0       0     7.74
32       0      0     0      0       0     3.27
43       0      0     0      0       0    12.98
60       0      0     0      0       0     7.48
那怎么办呢

杰夫解决方案更新:

>>> quote_df = get_quote()
>>> quote_df[quote_df['TPrice']==0][['TPrice','THigh','TLow','TOpen','TClose','TPCLOSE','RT','TVol']][0:5]
    TPrice  THigh  TLow  TOpen  TClose  TPCLOSE   RT  TVol
13       0      0     0      0       0     4.19 -100     0
32       0      0     0      0       0     3.27 -100     0
43       0      0     0      0       0    12.98 -100     0
45       0      0     0      0       0    26.74 -100     0
60       0      0     0      0       0     7.48 -100     0
>>> row_selection = quote_df['TPrice']==0
>>> col_selection = ['THigh','TLow','TOpen','TClose']
>>> for col in col_selection:
...     quote_df.loc[row_selection, col] = quote_df['TPCLOSE']
... 
>>> quote_df[quote_df['TPrice']==0][['TPrice','THigh','TLow','TOpen','TClose','TPCLOSE','RT','TVol']][0:5]
    TPrice  THigh  TLow  TOpen  TClose  TPCLOSE   RT  TVol
13       0   4.19  4.19   4.19    4.19     4.19 -100     0
32       0   4.19  4.19   4.19    4.19     3.27 -100     0
43       0   4.19  4.19   4.19    4.19    12.98 -100     0
45       0   4.19  4.19   4.19    4.19    26.74 -100     0
60       0   4.19  4.19   4.19    4.19     7.48 -100     0
>>> 

此操作不会自动广播,因此您需要执行以下操作

In [17]: df = DataFrame(dict(A = [1,2,0,0,0],B=[0,0,0,10,11],C=[3,4,5,6,7]))

In [18]: df
Out[18]: 
   A   B  C
0  1   0  3
1  2   0  4
2  0   0  5
3  0  10  6
4  0  11  7
计算要首先屏蔽的行(否则它们可能会随着您的移动而改变) 如果您正在修改(如您所处的位置)

这需要进行更改以使其更自然(因为您正在将rhs上的一个系列分配给lhs上的一个数据帧,而该数据帧现在并不像您认为的那样进行广播)

您正在执行链式分配,因此需要修改副本,请参见;尝试
df.loc[rows\u selector,columns\u selector]=…
I尝试做:df.loc[df['TPrice']=0,['THigh','TLow','TOpen','TClose']=df['TPCLOSE'],但是TLow,TOpen,TClose没有设置与TPCLOSE相同的值。我遵循您的方法,但数据框只是将单个值4.19复制到所有单元格,而不是一系列值,请参考“Jeff解决方案的更新”。(我将数据框quote_df pickle在上)。不知道为什么。(熊猫0.11.0)你需要0.12,0.11,因为这样的事情OK。我会升级到0.13可用。谢谢。现在我必须一个接一个地设置为:row_selection=quote_df['TPrice']=0;value_set=quote_df['TPCLOSE'];quote_df.TOpen[row_selection]=值集合;引用值集合[行选择]=值集合
In [17]: df = DataFrame(dict(A = [1,2,0,0,0],B=[0,0,0,10,11],C=[3,4,5,6,7]))

In [18]: df
Out[18]: 
   A   B  C
0  1   0  3
1  2   0  4
2  0   0  5
3  0  10  6
4  0  11  7
In [19]: mask = df['A'] == 0

In [20]: for col in ['A','B']:
   ....:     df.loc[mask,col] = df['C']
   ....:     

In [21]: df
Out[21]: 
   A  B  C
0  1  0  3
1  2  0  4
2  5  5  5
3  6  6  6
4  7  7  7