2013-10-09 81 views
0

我導入CSV作爲數據框使用:Python的熊貓:解決「列出對象沒有屬性‘祿’」

import numpy as np 
import pandas as pd 

df = pd.read_csv("test.csv") 

然後我試圖做一個簡單的基於ID的替換:
df.loc[df.ID == 103, ['fname', 'lname']] = 'Michael', 'Johnson'

我得到以下錯誤:

AttributeError: 'list' object has no attribute 'loc'

注意,當我做print pd.version()我得到0.12.0,所以在11之前的版本中這不是問題(至少據我瞭解)。有任何想法嗎?

+0

該語法適用於我 - 如果您提供可重複的示例,那麼它會更容易幫助,因爲它可能取決於csv文件中數據的問題。 –

+0

是的也適用於我,您的csv樣本可能會有所幫助。 – drexiya

回答

2

要從評論皮卡的數量相匹配祿分配工作得很好:「我這樣做:」

df = [df.hc== 2] 

你所創造的有一個「掩碼」:一個布爾值數組,表示索引的哪一部分滿足您的條件。

要在條件過濾您的數據幀要做到這一點:

df = df[df.hc == 2] 

更明確的有點是這樣的:

mask = df.hc == 2 
df = df[mask] 

如果你想保持整個數據框,而且只想替換具體的值,有這樣的替換方法:Python pandas equivalent for replace。另一種(性能明智的)方法是創建一個單獨的DataFrame,其中from/to values爲列,並使用pd.merge將其組合到現有的DataFrame中。和使用指標的設定值也可能:

df[mask]['fname'] = 'Johnson' 

但對於較大的一組取代了你想使用的另外兩種方法中的一種,或使用「應用」與拉姆達函數(值轉換) 。最後但並非最不重要的是:您可以使用.fillna('bla')快速填充NA值。

+0

非常感謝! – Parseltongue

0

回溯顯示df是list而不是DataFrame,正如您在代碼行中所預期的那樣。

這意味着在df = pd.read_csv("test.csv")df.loc[df.ID == 103, ['fname', 'lname']] = 'Michael', 'Johnson'之間,您有其他代碼行將列表對象分配給df。回顧那段代碼找到你的bug

+0

你骯髒的狗是對的。我正在做'df = [df.hc == 2]',我想這是將它轉換成一個列表?我如何DataFramify它? – Parseltongue

0

@有聲答案是正確的。如果右手邊列表替換元素

In [56]: df = DataFrame(dict(A =[1,2,3], B = [4,5,6], C = [7,8,9])) 

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

In [58]: df.loc[1,['A','B']] = -1,-2 

In [59]: df 
Out[59]: 
    A B C 
0 1 4 7 
1 -1 -2 8 
2 3 6 9 
相關問題