【问题标题】:combining three dataframes with matching timestamps and duration match将三个数据帧与匹配的时间戳和持续时间匹配相结合
【发布时间】:2020-01-17 23:50:08
【问题描述】:

注意:这个问题与combining three different timestamp dataframes using duration match这里的回答问题有些相似

我有两个主数据帧和一个从数据帧。两个主数据帧数据每 30 分钟出现一次。我将三个数据帧与主数据帧结合起来作为参考,并匹配来自从属的时间戳,如下所示。在特定会话期间获取的两个主人的数据应该出现在一行中。

我的意见

mas_df1 = 
        index           S1
2019-01-09 13:20:17  2202.517620
2019-01-09 14:00:17  2392.173558

mas_df2 = 
        index           S2
2019-01-09 13:24:32  2134.791454
2019-01-09 14:04:32  1958.719125

mas_list  = [mas_df1,mas_df2]

slv_df = 
   index                  POA      
2019-01-09 13:20:00    752.743700
2019-01-09 13:20:17    742.961815
2019-01-09 13:24:32    697.267647
2019-01-09 13:24:48    699.418420
2019-01-09 14:00:00    778.720800
2019-01-09 14:00:17    791.852790
2019-01-09 14:04:32    691.605547
2019-01-09 14:04:48    688.313520

合并后的数据帧应该有两个master的时间戳和完整的数据。但是,只有从属 df 的数据应该以匹配的时间戳附加到它。

我目前的代码 如下所示。

aux = []
for i in range(0,len(mas_list),1):
    s1=slv_df['POA'].reindex(mas_list[i].index,method='nearest').add_prefix(mas_list[i].columns[0])  
    if i==0:
        aux.append(s1.join(mas_list[i]))
    else:
        aux.append(s1.join(mas_list[i]).reindex(aux.index,method='nearest'))
cmb_df = pd.concat(aux,axis=1)    

我现在的输出是:

raise ValueError("cannot reindex a non-unique index "

ValueError: cannot reindex a non-unique index with a method or limit

我的预期输出是:

cmd_df = 
        index           S1              S1POA        S2               S2POA
2019-01-09 13:20:17  2202.517620     742.961815     2134.791454    697.267647 
2019-01-09 14:00:17  2392.173558     791.852790     1958.719125    691.605547 

有什么改进我的代码的建议吗?

【问题讨论】:

  • 我会使用 df.merge() 而不是 concat()。

标签: python pandas dataframe


【解决方案1】:

这是你要找的吗?

import pandas as pd

# create dataframes
mas_df1 = pd.DataFrame({'S1': [2202.517620, 2392.173558]}, index=pd.to_datetime(['2019-01-09 13:20:17', '2019-01-09 14:00:17']))
mas_df2 = pd.DataFrame({'S2': [2134.791454, 1958.719125]}, index=pd.to_datetime(['2019-01-09 13:24:32', '2019-01-09 14:04:32']))
slv_df = pd.DataFrame(
    {'POA': [752.743700, 742.961815, 697.267647, 699.418420, 778.720800, 791.852790, 691.605547, 688.313520]},
    index = pd.to_datetime(['2019-01-09 13:20:00', '2019-01-09 13:20:17', '2019-01-09 13:24:32', '2019-01-09 13:24:48',
                            '2019-01-09 14:00:00', '2019-01-09 14:00:17', '2019-01-09 14:04:32', '2019-01-09 14:04:48'])
)


# combine slave to master (i.e. left join per master df)
mas_df1 = mas_df1.merge(slv_df, how='left', left_index=True, right_index=True).rename(columns={'POA': 'S1PAO'})
mas_df2 = mas_df2.merge(slv_df, how='left', left_index=True, right_index=True).rename(columns={'POA': 'S2PAO'})

# combine two master dataframes, by matching to the nearest time
mas_df2 = mas_df2.reindex(mas_df1.index, method='nearest')  # set index of df2 to match (nearest) index of df1
mas_df = pd.concat([mas_df1, mas_df2], axis=1)  # comnine dataframe

mas_df

编辑:对数据框列表执行相同操作

# combine slave to master (i.e. left join per master df)
mas_list  = [mas_df1, mas_df2]
for i, df in enumerate(mas_list):
    mas_list[i] = df.merge(slv_df, how='left', left_index=True, right_index=True).rename(columns={'POA': f'S{i}PAO'})


# combine master dataframes, by matching to the nearest time of the first master frame
for i, df in enumerate(mas_list[1:]):
    mas_list[i+1] = df.reindex(mas_list[0].index, method='nearest')   # set index of mas dfs > 1 to match (nearest) index of df1

mas_df = pd.concat(mas_list, axis=1)  # comnine dataframe

【讨论】:

  • 如果我有两个以上的主 dfs 怎么办?它可以放在一个循环中吗?谢谢
  • 代码可能会更简洁一些,但应该这样做。
  • 我试过了,但在执行代码的第二部分时出现以下错误,该代码通过匹配第一个主帧的最近时间来组合主数据帧。 raise ValueError("cannot reindex a non-unique index " ValueError: cannot reindex a non-unique index with a method or limit。在这两者之间,代码的第一部分确实运行良好。
  • 这表明您的 >second 主数据帧之一中存在重复的时间戳。您能否与mas_dfX.groupby(mas_dfX.index).count().sort_values('SX', ascending=False) 核对一下(其中X 是第x 个主df)。另外,请注意,当前的方法假定主数据帧之间的时间戳具有一定的一致性。 df.reindex(method='nearest') 将尝试将主 dfx 的每一行与主 df1 的时间戳匹配。但是,如果 dfx 有不止一行与 df1 的单行匹配,您可能会遇到不希望的行为(例如,dfx 中遗漏的行)。
猜你喜欢
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 2018-10-09
相关资源
最近更新 更多