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