在公共列上连接两个数据帧

时间:2017-03-22 09:22:10

标签: sql pandas join dataframe

我想加入两个数据源,订单和客户:

订单是SQL Server表:

orderid| customerid | orderdate | ordercost
------ | -----------| --------- | --------
12000  | 1500       |2008-08-09 |  38610

和客户是csv文件:

customerid,first_name,last_name,starting_date,ending_date,country
1500,Sian,Read,2008-01-07,2010-01-07,Greenland

我想在我的Python应用程序中加入这两个表,所以我编写了以下代码:

# Connect to SQL Sever with Pyodbc library

connection = pypyodbc.connect("connection string here")
cursor=connection.cursor();
cursor.execute("SELECT * from order)
result= cursor.fetchall()

# convert the result to pandas Dataframe
df1 = pd.DataFrame(result, columns= ['orderid','customerid','orderdate','ordercost'])

# Read CSV File
df2=pd.read_csv(customer_csv)

# Merge two dataframes
merged= pd.merge( df1, df2, on= 'customerid', how='inner')
print(merged[['first_name', 'country']])

我希望

first_name | country
-----------|--------
Sian       | Greenland

但我得到空洞的结果。

当我为两个来自CSV文件的数据帧执行此代码时,它可以正常工作。有什么帮助吗?

感谢。

2 个答案:

答案 0 :(得分:1)

我认为问题是列customeriddtypes中的列DataFrames不同,所以不匹配。

因此,需要将两列都转换为int或两者都转换为str

df1['customerid'] = df1['customerid'].astype(int)
df2['customerid'] = df2['customerid'].astype(int)

或者:

df1['customerid'] = df1['customerid'].astype(str)
df2['customerid'] = df2['customerid'].astype(str)

也可以省略how='inner',因为默认值为merge

merged= pd.merge( df1, df2, on= 'customerid')

答案 1 :(得分:1)

pd.merge的空数据帧结果表示两个帧中没有任何匹配值。你检查过数据的类型了吗?使用

df1['customerid'].dtype

检查。

以及导入后转换(如另一个答案所示),你也可以在阅读csv时告诉pandas你想要什么dtype

df2=pd.read_csv(customer_csv, dtype={'customerid': str))