【问题标题】:How to merge the Time Series Panda Data Frame without loosing the row?如何在不丢失行的情况下合并 Time Series Panda Dataframe?
【发布时间】:2019-01-08 16:04:34
【问题描述】:

标题

  1. 如何在不丢失行的情况下合并时间序列数据帧?
  2. 最终结果DataFrame shape应该基于哪个DataFrame有更大的DataFrame shape。

DF1:

0  17.12.2014 13:56:56                        1.9
1  17.12.2014 13:56:58                        3.1
2  17.12.2014 13:56:59                        2.8
3  17.12.2014 13:57:10                        2.3
4  17.12.2014 13:57:11                        3.1

df1.shape 大约是 3000

df2:
       Time                                    Value
1   17.12.2014 13:55:56                        2.9
2   17.12.2014 13:55:58                        6.0
3   17.12.2014 13:55:58                        3.6
4   17.12.2014 13:55:59                        2.8
5   17.12.2014 13:56:07                        1.9
6   17.12.2014 13:56:12                        2.9
7   17.12.2014 13:56:12                        3.0
8   17.12.2014 13:56:13                        1.8
9   17.12.2014 13:56:15                        2.2
10  17.12.2014 13:56:15                        2.0
11  17.12.2014 13:56:41                        1.7
12  17.12.2014 13:56:41                        2.4
13  17.12.2014 13:56:42                        2.8
14  17.12.2014 13:56:42                        1.9
15  17.12.2014 13:56:43                        2.8
16  17.12.2014 13:56:43                        1.7
17  17.12.2014 13:56:44                        2.8
18  17.12.2014 13:56:45                        1.7
19  17.12.2014 13:56:59                        2.8
20  17.12.2014 14:03:08                        1.7

df2.shape 在 20000 左右

df3 

1   17.12.2014 13:56:12                        3.2

df3.shape 大约是 5000

我需要如下的结果数据帧,结果数据帧大小应该(20000)按照 DF2 大小:

    Time                   Value1          Value2                       Value3                
1   17.12.2014 13:55:56        NaN             2.9                            NaN                    
2   17.12.2014 13:55:58        NaN             6.0                            NaN                    
3   17.12.2014 13:55:58        NaN             3.6                            NaN                    
4   17.12.2014 13:55:59        NaN             2.8                            NaN                    
5   17.12.2014 13:56:07        NaN             1.9                            NaN                    
6   17.12.2014 13:56:12        NaN             2.9                            NaN                    
7   17.12.2014 13:56:12        NaN             3.0                            3.2                    
8   17.12.2014 13:56:13        NaN             1.8                            NaN                    
9   17.12.2014 13:56:15        NaN             2.2                            NaN                    
10  17.12.2014 13:56:15        NaN             2.0                            NaN                    
11  17.12.2014 13:56:41        NaN             1.7                            NaN                    
12  17.12.2014 13:56:41        NaN             2.4                            NaN                    
13  17.12.2014 13:56:42        NaN             2.8                            NaN                    
14  17.12.2014 13:56:42        NaN             1.9                            NaN                    
15  17.12.2014 13:56:43        NaN             2.8                            NaN                    
16  17.12.2014 13:56:43        NaN             1.7                            NaN                    
17  17.12.2014 13:56:44        NaN             2.8                            NaN                    
18  17.12.2014 13:56:45        NaN             1.7                            NaN       
19  17.12.2014 13:56:56        1.9             NaN                            NaN
20  17.12.2014 13:56:58        3.1             NaN                            NaN
21  17.12.2014 13:56:59        2.8             2.8                            NaN
22  17.12.2014 13:57:10        2.3             NaN                            NaN
23  17.12.2014 13:57:11        3.1             NaN                            NaN
20  17.12.2014 14:03:08        NaN             1.7                            NaN

谢谢

【问题讨论】:

    标签: python pandas datetime dataframe time-series


    【解决方案1】:

    我想你想要的是outer join

    pd.merge(df1, df2, how = 'outer', on = 'Time')
    

    这是完全外连接。您可以将outer 更改为leftright 用于左/右外连接。

    【讨论】:

    • pd.merge(df1, df2, how = 'outer', on = 'Time').sort_values(by = 'Time')
    • 只使用两个数据帧。如果我添加第三帧,它会显示多值错误。假设 df1 有 1000 df2 有 2000。当我合并时,我得到了大约 3000 行。假设我在 df3 中还有 3000 行。现在我重复使用相同的命令,例如 pd.merge(merged, df3, how = 'outer', on = 'Time').sort_values(by = 'Time') 。现在期望是 6000 行。但我正在最终合并 9000 行
    • @thangaraj1980, 1. 您的时间列有重复值; 2. 进行外连接时,结果不应接近 len(df1) + len(df2)。这表明 df1['time'] 和 df2['time'] 几乎从不匹配
    【解决方案2】:

    将索引设置为时间,然后使用outer 加入。您可以使用functools 中的reduce 来使语法简洁。

    from functools import reduce
    
    reduce(lambda l,r: l.join(r, how='outer'), [df.set_index('Time') for df in [df1, df2, df3]])
    

    输出:

                         Val1  Val2  Val3
    Time                                 
    17.12.2014 13:55:56   NaN   2.9   NaN
    17.12.2014 13:55:58   NaN   6.0   NaN
    17.12.2014 13:55:58   NaN   3.6   NaN
    17.12.2014 13:55:59   NaN   2.8   NaN
    17.12.2014 13:56:07   NaN   1.9   NaN
    17.12.2014 13:56:12   NaN   2.9   3.2
    17.12.2014 13:56:12   NaN   3.0   3.2
    17.12.2014 13:56:13   NaN   1.8   NaN
    17.12.2014 13:56:15   NaN   2.2   NaN
    17.12.2014 13:56:15   NaN   2.0   NaN
    17.12.2014 13:56:41   NaN   1.7   NaN
    17.12.2014 13:56:41   NaN   2.4   NaN
    17.12.2014 13:56:42   NaN   2.8   NaN
    17.12.2014 13:56:42   NaN   1.9   NaN
    17.12.2014 13:56:43   NaN   2.8   NaN
    17.12.2014 13:56:43   NaN   1.7   NaN
    17.12.2014 13:56:44   NaN   2.8   NaN
    17.12.2014 13:56:45   NaN   1.7   NaN
    17.12.2014 13:56:56   1.9   NaN   NaN
    17.12.2014 13:56:58   3.1   NaN   NaN
    17.12.2014 13:56:59   2.8   2.8   NaN
    17.12.2014 13:57:10   2.3   NaN   NaN
    17.12.2014 13:57:11   3.1   NaN   NaN
    17.12.2014 14:03:08   NaN   1.7   NaN
    

    请注意,在您提供的输入中,17.12.2014 13:56:12df2 中有两个条目,因此df3 中的值被带到这两行。

    【讨论】:

    • 我试过合并。但我需要检查数据是否正确合并。需要进一步澄清我的实际 df1 形状是(3000,2)df2 大小是(20000,2),df3 是(50000,2)。但最终合并显示 (82,000,3)。你知道为什么吗?
    • @thangaraj1980 只要每个DataFrame 有一个名为'Time' 的列并且您.set_index('Time') 连接就可以保证匹配基于Time 的行。现在在您的示例中,时间始终采用相同的格式,所以我不需要做任何事情,但如果它们采用不同的格式,首先将它们转换为 datetimepd.to_datetime 可能会更安全,这会格式化所有日期相同
    • @thangaraj1980 最终输出的长度取决于每帧内的重复。在您的示例数据中,有重复的时间条目,因此这可能是原因。例如,如果您有 2 个DataFrames,每个只有 10 个具有相同确切时间的条目,则外部合并的结果是 100 行 (10*10)。您的结果可能有 50,000 到 3 万亿行,因此 82,000 行不足为奇。
    【解决方案3】:

    join 方法正是为这些类型的情况而构建的。您可以将任意数量的 DataFrame 与其连接在一起。调用 DataFrame 与传递的 DataFrame 集合的索引连接。要使用多个 DataFrame,您必须将连接列放在索引中。

    dfs = [df1, df2, df3]
    dfs = [df.set_index('Time') for df in dfs]
    dfs[0].join(dfs[1:])
    

    从@Ted Petrou 学习,同时参加他的在线课程。

    合并:

    df1.merge(df2,on='Time', how='outer').merge(df3,on='Time')
    

    pd.merge(pd.merge(df1,df2,on='Time', how='outer'),df3,on='Time')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-30
      • 2013-09-14
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2012-01-01
      相关资源
      最近更新 更多