如何在Python中合并两个数据帧?
我正在尝试使用内部连接连接两个熊猫数据帧如何在Python中合并两个数据帧?,python,pandas,Python,Pandas,我正在尝试使用内部连接连接两个熊猫数据帧 my_df = pd.merge(df1, df2, how = 'inner', left_on = ['date'], right_on = ['myDate']) 但是,我得到以下错误: KeyError:'myDate'类型错误:需要整数 我相信在日期加入是有效的,但我不能让这个简单的加入工作 DF2是使用以下方法创建的 df2=idf.groupby(λx:(x.year,x.month,x.day)).mean() 有人能给点建议吗?非
my_df = pd.merge(df1, df2, how = 'inner', left_on = ['date'], right_on = ['myDate'])
但是,我得到以下错误:
KeyError:'myDate'类型错误:需要整数
我相信在日期加入是有效的,但我不能让这个简单的加入工作
DF2是使用以下方法创建的
df2=idf.groupby(λx:(x.year,x.month,x.day)).mean()
有人能给点建议吗?非常感谢
df1
类型对象
id对象
日期对象
值浮动64
类型id日期值
0辆车PSTAT001 15/07/15 42
1辆自行车PSTAT001 16/07/15 42
2辆自行车PSTAT001 17/07/15 42
3辆自行车PSTAT0004 18/07/15 42
4自行车PSTAT0001 19/07/15 32
df2
myDate对象
val1浮动64
val2浮动64
val3浮动64
myDate val1 val2 val3
0 (2015,7,13) 1074 1871.666667 2800.777778
1 (2015,7,14) 347.958333 809.416667 1308.458333
2 (2015,7,15) 202.625 597.375 1008.666667
3 (2015,7,16) 494.958333 1192 1886.916667
DF1.info()
INT64索引:3040个条目,0到3039
数据列(共4列):
类型3040非空对象
ID3040非空对象
日期3040非空对象
值3040非空浮点64
数据类型:float64(1),object(3)
内存使用率:118.8+KB
DF2.info()
INT64索引:16个条目,从0到15
数据列(共4列):
myDate 16非空对象
val1 16非空浮点64
val2 16非空浮点64
val3 16非空浮点64
数据类型:float64(3),object(1)
内存使用:640.0+字节
您的日期列不是datetime数据类型,df1
看起来像str
,而另一个是元组
,因此您需要先转换这些数据类型,然后进行合并:
In [75]:
df1['date'] = pd.to_datetime(df1['date'])
df1.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 0 to 4
Data columns (total 4 columns):
type 5 non-null object
id 5 non-null object
date 5 non-null datetime64[ns]
value 5 non-null int64
dtypes: datetime64[ns](1), int64(1), object(2)
memory usage: 200.0+ bytes
In [76]:
import datetime as dt
df2['myDate'] = df2['myDate'].apply(lambda x: dt.datetime(x[0], x[1], x[2]))
df2.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4 entries, 0 to 3
Data columns (total 4 columns):
myDate 4 non-null datetime64[ns]
val1 4 non-null float64
val2 4 non-null float64
val3 4 non-null float64
dtypes: datetime64[ns](1), float64(3)
memory usage: 160.0 bytes
In [78]:
my_df= pd.merge(df1, df2, how = 'inner', left_on = ['date'], right_on = ['myDate'])
my_df
Out[78]:
type id date value myDate val1 val2 \
0 CAR PSTAT001 2015-07-15 42 2015-07-15 202.625000 597.375
1 BIKE PSTAT001 2015-07-16 42 2015-07-16 494.958333 1192.000
val3
0 1008.666667
1 1886.916667
[75]中的
df1['date']=pd.to_datetime(df1['date'])
df1.info()
INT64索引:5个条目,从0到4
数据列(共4列):
类型5非空对象
ID5非空对象
日期5非空datetime64[ns]
值5非空int64
数据类型:datetime64[ns](1)、int64(1)、object(2)
内存使用:200.0+字节
在[76]中:
将日期时间导入为dt
df2['myDate']=df2['myDate'].apply(λx:dt.datetime(x[0],x[1],x[2]))
df2.info()
INT64索引:4个条目,0到3
数据列(共4列):
myDate 4非空datetime64[ns]
val1 4非空浮点64
val2 4非空浮点64
val3 4非空浮点64
数据类型:datetime64[ns](1),float64(3)
内存使用:160.0字节
在[78]中:
my_df=pd.merge(df1,df2,how='internal',left_on=['date'],right_on=['myDate'])
我的
出[78]:
类型id日期值myDate val1 val2\
0辆车PSTAT001 2015-07-15 42 2015-07-15 202.625000 597.375
1辆自行车PSTAT001 2015-07-16 42 2015-07-16 494.958333 1192.000
val3
0 1008.666667
1 1886.916667
正如评论所说,缺乏匹配来自不同的数据格式。将df1的“日期”字段作为对象,而将df2的“myDate”作为元组表示的对象
首先,让我们将df1“date”转换为datetime,正如@EdChum所建议的那样
df1 = pd.DataFrame(data = np.array([['CAR', 'PSTAT001', '15/07/15', 42]]), \
columns = ['type','id','date','value'])
df1['date']=pd.to_datetime(df1['date'])
然后,正如@EdChum所建议的,我们使用datetime库将元组转换为字符串
df2 = pd.DataFrame(data = np.array([[(2015,7,15) ,202.625 ,597.375,1008.666667]]), \
columns = ['myDate','val1','val2','val3'])
df2['myDate'] = df2['myDate'].apply(lambda x: datetime(x[0], x[1], x[2]))
从那里我们的合并工作。我只使用了df1的第0行和第3行来简化ide中的事情
my_df= pd.merge(df1, df2, how = 'inner', left_on = ['date'], right_on = ['myDate'])
my_df[:1]
Out[21]:
type id date value myDate val1 val2 val3
0 CAR PSTAT001 2015-07-15 42 2015-07-15 202.625 597.375 1008.667
您的
df2['myDate']
看起来像一个带整数的元组,您可以发布df1.info()
和df2.info()
df1 Int64Index:3040个条目,0到3039个数据列(共4列)的输出吗:类型3040非空对象id 3040非空对象日期3040非空对象值3040非空浮点64数据类型:浮点64(1),对象(3)内存使用率:118.8+KBDF2:Int64索引:16个条目,0到15个数据列(共4列):myDate 16非空对象val1 16非空float64 val2 16非空float64 val3 16非空float64 val3 16非空float64数据类型:float64(3),对象(1)内存使用率:640.0+字节请编辑您的问题,格式在注释中丢失,感谢缺少格式的逻辑,仍在学习。Ed Chum您是一位成功的传奇人物。非常感谢你的帮助。我刚才也投了赞成票这就是我在写答案之前喝咖啡的结果。