df=pd.DataFrame({'a':[1,2,3]})
df[df['a']==3].a = 4
這不分配4到3
df[df['a']==3] = 4
但這個工程。
它讓我很困惑如何分配工作。感謝有人能給我一些參考或解釋。
df=pd.DataFrame({'a':[1,2,3]})
df[df['a']==3].a = 4
這不分配4到3
df[df['a']==3] = 4
但這個工程。
它讓我很困惑如何分配工作。感謝有人能給我一些參考或解釋。
你做不要使用第二種方法。它返回一個數據框子切片併爲每一行分配相同的值。
例如,
df
a b
0 1 4
1 2 3
2 3 6
df[df['a'] == 3]
a b
2 3 6
df[df['a']==3] = 3
df
a b
0 1 4
1 2 3
2 3 3
第一種方法不起作用,因爲布爾索引返回列(系列),其試圖將分配給副本,所以分配失敗:
df[df['a'] == 3].a = 4
/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/pandas/core/generic.py:3110: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self[name] = value
所以,你的選擇是使用.loc
(按名稱訪問)或iloc
(通過索引訪問)基於索引:
df.loc[df.a == 3, 'a'] = 4
df
a
0 1
1 2
2 4
如果您正在傳遞布爾掩碼,則不能使用iloc
。
使用loc
In [1289]: df.loc[df['a']==3, 'a'] = 4
In [1290]: df
Out[1290]:
a
0 1
1 2
2 4
使用.loc
布爾索引和列標籤的選擇:
df.loc[df.a == 3,'a'] = 4
print(df)
輸出:
a
0 1
1 2
2 4
在你的方法正在發生的事情是,你是切片你的數據框和熊貓正在創建一個副本和那個屁股調整發生在數據幀的副本上,而不是原始數據幀本身。
你會想這樣做
df['a'].apply(lambda x: 4 if x ==3 else x)
這將使:
0 1
1 2
2 4
應用被認爲是骯髒的拒絕熊貓API家庭。 –
或者你也可以做這樣的
df['a'] = df['a'].replace(3, 4)
(修改,感謝@COLDSPEED)
'df.a = np.where(df.a == 3,4,df.a)'也許他對'numpy' :-)也很好 – Wen