我有一个带有date_time / voltage数据的熊猫DataFrame,如下所示(df1):
Date_Time Chan
0 20130401 9:00 AAT
1 20130401 10:00 AAT
2 20130401 11:00 AAT
3 20130401 12:00 AAT
4 20130401 13:00 AAT
5 20130401 14:00 AAT
6 20130401 15:00 AAT
我使用它作为原型来加载来自更大的数据文件的数据并创建一个DataFrame。另一个DataFrame看起来像这样(df2):
Chan date_time Sens1 Sens2
AAC 01-Apr-2013 09:00 5.17 1281
AAC 01-Apr-2013 10:00 5.01 500
AAC 01-Apr-2013 12:00 5.17 100
AAC 01-Apr-2013 13:00 5.19 41997
AAC 01-Apr-2013 16:00 5.21 2123
AAT 01-Apr-2013 09:00 28.82 300
AAT 01-Apr-2013 10:00 28.35 4900
AAT 01-Apr-2013 12:00 28.04 250
AAE 01-Apr-2013 11:00 3.36 400
AAE 01-Apr-2013 12:00 3.41 200
AAE 01-Apr-2013 13:00 3.40 2388
AAE 01-Apr-2013 14:00 3.37 300
AAE 01-Apr-2013 15:00 3.35 500
AXN 01-Apr-2013 09:00 23.96 6643
AXN 01-Apr-2013 10:00 24.03 1000
AXW 01-Apr-2013 11:00 46.44 2343
所以我想要做的是从df1的两列(注意不同的数据格式)搜索df2所有匹配实例,并将df2中的数据插入到df1中。像这样(df1)
Date_Time Chan Sens1 Sens2
0 20130401 9:00 AAT 28.82 300
1 20130401 10:00 AAT 28.35 4900
2 20130401 11:00 AAT NaN NaN
3 20130401 12:00 AAT 28.04 250
4 20130401 13:00 AAT NaN NaN
5 20130401 14:00 AAT NaN NaN
6 20130401 15:00 AAT NaN NaN
你能否给我一些python / pandas代码的建议来匹配这个伪代码:
if (df1['date_time'] = df2['date_time']) & (df1['Chan'] = df2['Chan'])):
df1['Sens1'] = df2['Sens1']
df1['Sens2'] = df2['Sens2']
如果它影响答案,我打算填充并填充NaN,然后将此DataFrame添加到Panel,然后用另一个频道名称代替AAT重复。
答案 0 :(得分:9)
您可以使用普通ol'合并来执行此操作。但首先,您应该对DataFrame进行一些清理,以确保您的datetime列实际上是日期时间而不是字符串(注意:在读取csv或其他任何内容时执行此操作可能更好):
df1['Date_Time'] = pd.to_datetime(df1['Date_Time'], format='%Y%m%d %H:%M')
df2['date_time'] = pd.to_datetime(df2['date_time'])
我们还要使用相同的名称重命名Datetime列:
df1.rename(columns={'Date_Time': 'Datetime'}, inplace=True)
df2.rename(columns={'date_time': 'Datetime'}, inplace=True)
现在,一个简单的合并将为您提供所需的内容:
In [11]: df1.merge(df2)
Out[11]:
Datetime Chan Sens1 Sens2
0 2013-04-01 09:00:00 AAT 28.82 300
1 2013-04-01 10:00:00 AAT 28.35 4900
2 2013-04-01 12:00:00 AAT 28.04 250
In [12]: df1.merge(df2, how='left')
Out[12]:
Datetime Chan Sens1 Sens2
0 2013-04-01 09:00:00 AAT 28.82 300
1 2013-04-01 10:00:00 AAT 28.35 4900
2 2013-04-01 11:00:00 AAT NaN NaN
3 2013-04-01 12:00:00 AAT 28.04 250
4 2013-04-01 13:00:00 AAT NaN NaN
5 2013-04-01 14:00:00 AAT NaN NaN
6 2013-04-01 15:00:00 AAT NaN NaN