8

我有一个带有日期时间/电压数据的熊猫数据框(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 添加到面板,然后用另一个频道名称代替 AAT 重复。

4

1 回答 1

9

您可以使用普通的 ol' 合并来执行此操作。但首先,您应该对 DataFrame 进行一些清理,以确保您的日期时间列实际上是日期时间而不是字符串(注意:在读取为 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
于 2013-09-26T01:21:07.607 回答