2017-02-27 48 views
2

我看不到我的問題在哪裏,這段代碼對於一個非常簡單的例子工作正常,但是當我開始使用我的真實數據時,我遇到了問題。爲什麼我的熊貓數據框變成'None'類型?

我基本上是從各種csv文件中提取某些數據,並試圖最終將它們合併到一個數據框中。

相關部分的代碼如下:

wavenames = ['W1_', 'W2_', 'W3_'] 
logs=['log1','log2','log3','log4'] 

for w in wavenames: 
    AllSynt = pd.DataFrame(index=range(6341), columns=['X']+logs) 
    AllSynt['X']=z # an array extracted from elsewhere 
    print AllSynt.head(3) 
    for f in files: 
     for l in logs: 
      if (f.startswith('Synthetic_'+w)) & (f.endswith(l+'.csv')): 
       df = pd.read_csv(path+f,delimiter=',') 
       AllSynt = pd.DataFrame(AllSynt) 
       AllSynt = AllSynt.merge(df,how='left',on='X') 
       AllSynt = AllSynt.rename(columns = {'Y':l}, inplace = True) 
    print '\n', AllSynt.head(5) 

,但是這給了我AttributeError: 'NoneType' object has no attribute 'head' (確保該AllSynt是在循環開始時的熊貓數據幀之前,我得到了同樣的錯誤(剛。說它有沒有屬性「合併」)爲什麼我的AllSynt數據框永久地變成一個None

+2

當您在'rename'操作期間提供'inplace = True'時,不需要將結果重新分配給變量。這就是爲什麼,這些返回值爲「無」值。 –

+0

謝謝,這有些幫助(所有的值都是'NaN',但至少它是一個數據框)。但是我仍然懷疑 - 正如問題中提到的那樣,在重命名過程之前的循環開始處已經出現了「無」值。那是爲什麼? – durbachit

+1

這是因爲你已經填充了它的柱面名稱,而只用預定義數組填充對應於'X'的值。 'logs'中的元素(*構成列名*)在它們下面沒有任何值,所以它們自然被'NaN''填充。 –

回答

1

你需要重寫行:

AllSynt = AllSynt.rename(columns={'Y':l}, inplace=True)

簡單以下幾點:

AllSynt.rename(columns={'Y':l}, inplace=True) # No assigning with inplace parameter 
# (or) 
AllSynt = AllSynt.rename(columns={'Y':l}  # assign without inplace parameter 

當您指定inplace=True,並希望看到它的內容,它會返回None,因爲他們僅僅是變異的DF,而不是創建它的一個新的副本。基本上,你分配None的結果,因此它抱怨AttributeError,因爲它不是pd.DataFrame對象了訪問它的.head()方法。

相似的類比可以通過在純Python做list.append()list.sort()等操作,而其分配結果在同一行的變量,這也出於同樣的原因返回None,因爲它們在默認情況下操作inplace觀察。