【发布时间】:2020-01-03 08:08:42
【问题描述】:
我有两个具有以下结构的数据框。
DF1
.... | Time | Site | AA | BB | CC |
58 | 20-04-2019 08:00:00 - 21-04-2019 08:00:00 | AR25 | 1 | NS | 93 |
59 | 21-04-1019 08:00:00 - 22-04-2019 08:00:00 | DP88 | NS | | 3 |
60 | 21-04-1019 08:00:00 - 22-04-2019 08:00:00 | DP88 | | 1 | 15 |
DF2
.... | Time | Error | Site |
10 | 20-04-2019 09:25:15 | 401 | AR25 |
11 | 20-04-2019 11:00:10 | 401 | AR25 |
15 | 21-04-2019 23:25:16 | 404 | DP88 |
AA、BB、CC 列存储有关每个站点的一些测量信息,可以包含数值或为空。 AA、BB、CC 中的记录可能取决于日期和地点。所以基本上我的步骤是:
1. 获取DF1中AA记录的行(然后BB,然后CC);
2. 使用时间间隔和站点名称作为在 DF2 中查找行的键
3. 将DF1的行的索引(索引)放在DF3对应的AA/BB/CC列中,其中时间、错误和站点记录与提供的时间间隔和站点名称匹配。
预计将实现的结果 DF3
.... | Time | Error |Site | AA | BB | CC |
1 | 20-04-2019 09:25:15 | 401 |AR25 | 58 | | 58 |
2 | 20-04-2019 11:00:10 | 401 |AR25 | 58 | 58 | |
2 | 21-04-2019 23:25:16 | 404 |DP88 | 59,60 | 59,60 | 59,60 |
为了方便使用,我把DF1中的Time列分成两列——开始和结束
df1['Start'] = df1['Time'].str.split(' - ').str[0]
df1['End'] = df1['Time'].str.split(' - ').str[1]
df1['Start'] = pd.to_datetime(df1['Start'])
df1['End'] = pd.to_datetime(df1['End'])
cols = ['AA','BB', 'CC']
for column in df1[cols]:
df1 = df1[(df1[column]!= 'NS') & (df1[column] != '0')]
for name in df1['Site'].unique():
if df2['Site'].str.contains(name) & df2['Time'].between(df1['Start'].values[0],df2['End'].values[0]):
values = df1.index.values.tolist()
df3[column] = [values]
第 1 步和第 2 步没问题,但第 3 步我无能为力。问题是我无法获取索引以构建具有我想要的结构的 df3,因为可能会重复每个 AA、BB、CC 列都有多个索引。
能否达到预期的效果?如果是,需要一些线索我需要做什么。
提前致谢
【问题讨论】:
-
你需要
df1['Time'] == df2['Time'] and df1['Site'] == df2['Site']的那些行? -
你能解释一下添加列的更多逻辑吗?因为例如
BB的 final 没有值,为什么? -
@jezrael 编辑了帖子。并非每个站点都可以在 AA-CC 列中包含记录。例如,站点 1 可以有 AA 和 CC 数据,站点 2 - 仅 BB,站点 3 - 所有三列中的记录
-
@ShanAli 之类的。 df1['Time'] 有一个时间间隔记录,而 df2['Time'] - 准确时间。所以 df2['Time'] 必须落在 df1['Time'] 的时间间隔内。这就是为什么我实际上将 df1['Time'] 拆分为 Start 和 End。