我有两个数据帧,如下所示:
time browncarbon blackcarbon
181.7335 0.105270 NaN
181.3809 0.166545 0.001217
181.6197 0.071581 NaN
422 rows x 3 columns
start end toc
179.9989 180.0002 155.0
180.0002 180.0016 152.0
180.0016 180.0030 151.0
1364 rows x 3 columns
第一个dataframe有一个时间列,每四分钟有一次瞬间。第二个数据帧具有每两分钟间隔的两个时间列。这两个时间列不是同时开始和结束的。但是,它们包含在同一天收集的数据。我如何创建包含以下内容的另一个数据帧:
time browncarbon blackcarbon toc
422 rows X 4 columns
关于Stack Overflow有一个相关的答案,但是,只有当time列是datetime或timestamp对象时才适用。链接是:How to join two dataframes for which column values are within a certain range?
附录1:封装到时间行之一中的多个开始行和结束行也应该对应于一个toc行,就像它现在所做的那样,然而,它应该是多个toc行的平均值,这不是目前的情况。
发布于 2019-07-16 21:34:13
我们创建一个人工键列来执行outer merge
,以获取笛卡尔乘积(行之间的所有匹配)。然后,我们使用.query
过滤时间在该范围内的所有行。
注意:__:我编辑了一行的值,这样我们就可以得到匹配(参见底部的示例数据帧中的第0行)
df1.assign(key=1).merge(df2.assign(key=1), on='key', how='outer')\
.query('(time >= start) & (time <= end)')\
.drop(['key', 'start', 'end'], axis=1)
输出
time browncarbon blackcarbon toc
1 180.0008 0.10527 NaN 152.0
使用的示例数据帧:
df1
time browncarbon blackcarbon
0 180.0008 0.105270 NaN
1 181.3809 0.166545 0.001217
2 181.6197 0.071581 NaN
df2
start end toc
0 179.9989 180.0002 155.0
1 180.0002 180.0016 152.0
2 180.0016 180.0030 151.0
发布于 2019-07-16 21:37:59
由于开始和结束间隔是互斥的,因此我们可以在df2中创建新列,使其包含floor( start )和floor( end )范围内的所有整数值。稍后,在df1中添加另一列作为floor(time),然后在df1和df2上进行左外部连接。我认为这是应该做的,但如果需要,您可能必须删除NaN值和额外的列。如果您将csv文件发送给我,我也许可以将脚本发送给您。我希望我已经回答了你的问题。
发布于 2019-07-16 21:45:31
您的第二个数据帧太短,因此它不会反映有意义的合并。所以我对它做了一些修改:
df2 = pd.DataFrame({'start': [179.9989, 180.0002, 180.0016, 181.3, 181.5, 181.7],
'end': [180.0002, 180.0016, 180.003, 181.5, 185.7, 181.8],
'toc': [155.0, 152.0, 151.0, 150.0, 149.0, 148.0]})
df1['Rank'] = np.arange(len(df1))
new_df = pd.merge_asof(df1.sort_values('time'), df2,
left_on='time',
right_on='start')
为您提供:
time browncarbon blackcarbon Rank start end toc
0 181.3809 0.166545 0.001217 1 181.3 181.5 150.0
1 181.6197 0.071581 NaN 2 181.5 185.7 149.0
2 181.7335 0.105270 NaN 0 181.7 181.8 148.0
您可以在Rank
上删除额外的列和sort_values
。例如:
new_df.sort_values('Rank').drop(['Rank','start','end'], axis=1)
提供:
time browncarbon blackcarbon toc
2 181.7335 0.105270 NaN 148.0
0 181.3809 0.166545 0.001217 150.0
1 181.6197 0.071581 NaN 149.0
https://stackoverflow.com/questions/57065538
复制