Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中合并两个数据帧?_Python_Pandas - Fatal编程技术网

如何在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您是一位成功的传奇人物。非常感谢你的帮助。我刚才也投了赞成票这就是我在写答案之前喝咖啡的结果。