2017-03-03 216 views
3

我試圖轉換列中列'side'的對應值等於'B'的行的負值。我不想丟失任何未轉換的行。我下面試過,但得到提高KeyError('%s not in index' % objarr[mask])根據Pandas Dataframe中另一列的內容在一列上運行操作

df[-df['nominal']].where(df['side']=='B') 
+0

你能張貼的樣本數據幀?沒有它,通過你的例子是很有挑戰性的。另外當你提到「試圖轉換負值」時,你想把它們轉換成什麼?你想讓他們成爲'B'嗎? – MattR

回答

1

你應該試試這個:

df.loc[ (df.side == 'B'), 'nominal' ] *= -1 
+0

是什麼促使您將此添加爲回答,因爲它與我已在下面提供的答案相同? – miradulo

2

在布爾指數只要使用兩個條件與&

df[(df.side == 'B') & (df.nominal < 0)] 

,或者如果你打算修改,

df.loc[(df.side == 'B') & (df.nominal < 0), 'nominal'] 

>>> df = pd.DataFrame(dict(side=['A']*3+['B']*3, nominal = [1, -2, -2, 2, 6, -5])) 
>>> df 
    nominal side 
0  1 A 
1  -2 A 
2  -2 A 
3  2 B 
4  6 B 
5  -5 B 

>>> df.loc[(df.side == 'B') & (df.nominal < 0), 'nominal'] = 1000 

>>> df 
    nominal side 
0  1 A 
1  -2 A 
2  -2 A 
3  2 B 
4  6 B 
5  1000 B 

這對你會經常遇到大熊貓篩選數據的一個非常標準的方式。請參閱Pandas文檔中的Boolean Indexing


更新

對於更新的問題描述,我們可以只使用增強賦值運算符*= -1乘我們的期望值。

df.loc[(df.side == 'B'), 'nominal'] *= -1 

>>> df = pd.DataFrame(dict(nominal = [1, 2, 5, 3, 5, 3], side=['A']*3 + ['B']*3)) 

>>> df 
    nominal side 
0  1 A 
1  2 A 
2  5 A 
3  3 B 
4  5 B 
5  3 B 

>>> df.loc[(df.side == 'B'), 'nominal'] *= -1 

df 
    nominal side 
0  1 A 
1  2 A 
2  5 A 
3  -3 B 
4  -5 B 
5  -3 B 
+0

我的問題有點棘手。 「名義」欄中的所有值都是正數。我只想轉換爲負值,如果相應的列側=「B」 – obabs

+0

@obabs我提供了一個更新我的答案。如果在原始問題中已經更清楚了,這將會有所幫助:) – miradulo

相關問題