簡體   English   中英

訪問數據框列中值的最佳方法是什么?

[英]What is the best way to access values in a dataframe column?

比如我有

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與布爾索引和列標簽選擇:

df.loc[df.a == 3,'a'] = 4
print(df)

輸出:

   a
0  1
1  2
2  4

在您的方法中,發生的事情是您正在切割數據幀,並且pandas正在創建副本,並且該分配發生在數據幀的副本而不是原始數據幀本身。

使用loc

In [1289]: df.loc[df['a']==3, 'a'] = 4

In [1290]: df
Out[1290]:
   a
0  1
1  2
2  4

或者你可以這樣做

df['a'] = df['a'].replace(3, 4)

(修改,謝謝@COLDSPEED)

你想要做的

df['a'].apply(lambda x: 4 if x ==3 else x)

這會給:

0    1
1    2
2    4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM