2017-10-20 56 views
1

我有三個csv文件,我們可以調用a,b和c。文件a具有包括郵政編碼的地理信息。文件b有統計數據。文件c只有郵政編碼。將對象轉換爲熊貓字符串後的關鍵錯誤?

我用大熊貓ab轉換爲我用於連接上,這是那兩個dataframes(intermediate_df)之間的共享列信息dataframes(a_dfb_df)。讀取文件c並將其轉換爲具有整數類型的zipcode的數據幀。我必須將其轉換爲字符串,以便將zipcode不視爲整數。但是,c_df將該列轉換爲字符串後將其視爲對象,這意味着我無法在c_df和intermediate_df之間進行連接以創建final_df。

爲了說明我的意思:

a_data = pd.read_csv("a.csv") 
b_data = pd.read_csv("b.csv", dtype={'zipcode': 'str'}) 
a_df = pd.DataFrame(a_data) 
b_df = pd.DataFrame(b_data) 

# file c conversion 
c_data = pd.read_csv("slcsp.csv", dtype={'zipcode': 'str'}) 
print ("This is c data types: ", c_data.dtypes) 
c_conversion = c_data['zipcode'].apply(str) 
print ("This is c_conversion data types: ", c_conversion.dtypes) 
c_df = pd.DataFrame(c_conversion) 
print ("This is c_df data types: ", c_df.dtypes) 

# Joining on the two common columns to avoid duplicates 
joined_ab_df = pd.merge(a_df, a_df, on =['state', 'area']) 

# Dropping columns that are not needed anymore 
ab_for_analysis_df = joined_ab.drop(['county_code','name', 'area'], axis=1) 

# Time to analyze this dataframe. Let's pick out only the silver values for 
a specific attribute 
silver_only_df = (ab_for_analysis_df[filtered_df.metal_name == 'Silver']) 

# Getting second lowest value of silver only 
sorted_silver = silver_only_df.groupby('zipcode')['rate'].nsmallest(2) 
sorted_silver_df = sorted_silver.to_frame() 

print ("We cleaned up our data. Let's join the dataframes.") 
print ("Final result...") 
print (c_df.dtypes) 
final_df = pd.merge(sorted_silver_df,c_df, on ='zipcode') 

這是我們運行之後得到:

This is c_data types: zipcode  object 
rate  float64 
dtype: object 
This is c_conversion_data types: object 
This is c_df data types: zipcode object 
dtype: object 
zipcode object 
dtype: object 

We cleaned up our data. Let's join the dataframes. 
This is the final result... 
KeyError: 'zipcode' 

任何想法,爲什麼它改變了數據類型和我怎麼那麼解決它,所以它所有最後加入?

+1

你可以添加'打印(c_df.columns)'和'打印(sorted_silver_df.columns)' – Dark

+0

所以倒數第二行:'打印(c_df.dtypes)'也不打印?這是奇怪的。我建議使用ipython/jupyter和'%debug'魔術功能,這樣你可以逐步處理這些錯誤。 –

+0

這是一個奇怪的問題。 @AndyHayden。打印c_df.dtypes工程雖然它給出奇怪的結果 –

回答

2

如果轉換爲str總是輸出dtype是對象。

對於檢查strings需要檢查type

print (c_data['zipcode'].apply(type)) 

爲了您的最後一個錯誤:

需要reset_index,因爲其他zipcode是指數,而不是列:

sorted_silver_df = silver_only_df.groupby('zipcode')['rate'].nsmallest(2).reset_index() 
final_df = pd.merge(sorted_silver_df,c_df, on ='zipcode') 

謝謝,Andy爲替代(未經測試):

sorted_silver_df = silver_only_df.groupby('zipcode', as_index=False)['rate'].nsmallest(2) 
final_df = pd.merge(sorted_silver_df,c_df, on ='zipcode') 

或者使用left_index=Trueriht_onmerge

sorted_silver = silver_only_df.groupby('zipcode')['rate'].nsmallest(2) 
sorted_silver_df = sorted_silver.to_frame() 
final_df = pd.merge(sorted_silver_df,c_df, right_on ='zipcode', left_index=True) 
+0

也可以在groupby(而不是'reset_index')使用'as_index = False' –

+0

謝謝,我添加它來回答。但有時它不起作用,所以我添加通知未經測試;) – jezrael

+0

謝謝。我似乎無法得到那個工作之一: '50 '' 名稱:郵政編碼,D型:object' '這是C_DATA類型:object' '這是c_df數據類型:郵政編碼object' ' dtype:object' 'zipcode object' 'dtype:object' '我們清理了我們的數據。讓我們加入數據框吧.' '最終結果...提高ValueError('len(right_on)必須等於數字'' 'ValueError:len(right_on)必須等於索引中的水平數量' '的'left'' –