【问题标题】:Fetch row-index and write it into dataframe获取行索引并将其写入数据帧
【发布时间】: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。

标签: python pandas dataframe


【解决方案1】:

用途:

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'])
df2['Time'] = pd.to_datetime(df2['Time'])

#reset_index for avoid lost indices in both, merge together
df = df2.reset_index().merge(df1.reset_index(), on='Site', how='left', suffixes=('','_'))
#filter by condition
df = df[df['Time'].between(df['Start'],df['End'])]

cols = ['AA','BB','CC']
#filter values not matching - not sure if 0 number or 0 string, so added both
m = ~df[cols].isin(['NS', 0, '0'])
#get values from index to cols
df[cols] = m.astype(int).mul(df.pop('index_'), axis=0)

#join together with filter out `0` values
f = lambda x: ','.join(x[x!=0].astype(str))

c = df2.columns.tolist()
#aggregate join
df = df.groupby(['index'] + c)[cols].agg(f).reset_index(level=c)
print (df)
                     Time  Error  Site  AA     BB     CC
index                                                   
10    2019-04-20 09:25:15    401  AR25  58            58
11    2019-04-20 11:00:10    401  AR25  58            58
15    2019-04-21 23:25:16    404  DP88  60  59,60  59,60

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-20
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2022-12-17
    • 2019-08-12
    • 1970-01-01
    相关资源
    最近更新 更多