2017-10-20 34 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'' –