【问题标题】:How to extract sequence of rows in output data pandas如何提取输出数据熊猫中的行序列
【发布时间】:2023-01-13 15:03:12
【问题描述】:

我有一个基于日期时间的数据框,如下所示,

                   timestamp       value  ...         metric        
36 2014-04-02 17:20:00  125.098263  ...           25.098263         
14 2014-04-06 16:25:00  140.072787  ...           265.171050        
10 2014-04-11 09:00:00  127.882020  ...           393.053070        
45 2014-04-11 09:05:00  115.705719  ...           508.758789        
24 2014-04-11 09:15:00  127.261178  ...           636.019967        
17 2014-04-11 09:20:00  121.157997  ...           757.177965        
49 2014-04-11 09:25:00  120.468468  ...           877.646433        
8  2014-04-11 09:45:00  135.642696  ...           1013.289128       
33 2014-04-11 09:55:00  125.210049  ...           1138.499178       
19 2014-04-11 10:05:00  159.259713  ...           1297.758890       
52 2014-04-11 10:20:00  150.082482  ...           1447.841373

我想创建名为“diff_col”的新列,其中包含“相同”或“差异”值。 如果日期不连续,则将其视为“差异”,否则为“相同”。 在上面的数据框中,2014-04-02 17:20:00 和 2014-04-06 16:25:00 与剩余的日期时间值相比是不同的日期。

如何创建 diff_col 。

我试过了, df['diff_col']=df.groupby(pd.Grouper(key = 'timestamp', freq='1D'))

但它没有正确创建预期的列。 我需要的数据框如下,

         timestamp       value  ...         metric               diff_col
36 2014-04-02 17:20:00  125.098263  ...           25.098263         diff
14 2014-04-06 16:25:00  140.072787  ...           265.171050        diff
10 2014-04-11 09:00:00  127.882020  ...           393.053070        same
45 2014-04-11 09:05:00  115.705719  ...           508.758789        same
24 2014-04-11 09:15:00  127.261178  ...           636.019967        same
17 2014-04-11 09:20:00  121.157997  ...           757.177965        same
49 2014-04-11 09:25:00  120.468468  ...           877.646433        same
8  2014-04-11 09:45:00  135.642696  ...           1013.289128       same
33 2014-04-11 09:55:00  125.210049  ...           1138.499178       same
19 2014-04-11 10:05:00  159.259713  ...           1297.758890       same
52 2014-04-11 10:20:00  150.082482  ...           1447.841373       same

请对此提出建议。

谢谢, 库马尔

【问题讨论】:

    标签: python pandas python-datetime


    【解决方案1】:

    您可以比较连续的行以查看这是否是同一日期(使用dt.normalize 提取)并将其用作石斑鱼以获取groupby.transform('size') 的大小,如果大小 > 1,则设置“相同”,否则设置“差异”在numpy.where的帮助下:

    import numpy as np
    
    # ensure datetime
    df['timestamp'] = pd.to_datetime(df['timestamp'])
    
    # get day
    s = df['timestamp'].dt.normalize()
    
    # compare successive rows and identify group size
    df['diff_col'] = np.where(df.groupby(s.ne(s.shift()).cumsum())
                                .transform('size').gt(1),
                              'same', 'diff')
    

    输出:

                 timestamp       value  ...       metric diff_col
    36 2014-04-02 17:20:00  125.098263  ...    25.098263     diff
    14 2014-04-06 16:25:00  140.072787  ...   265.171050     diff
    10 2014-04-11 09:00:00  127.882020  ...   393.053070     same
    45 2014-04-11 09:05:00  115.705719  ...   508.758789     same
    24 2014-04-11 09:15:00  127.261178  ...   636.019967     same
    17 2014-04-11 09:20:00  121.157997  ...   757.177965     same
    49 2014-04-11 09:25:00  120.468468  ...   877.646433     same
    8  2014-04-11 09:45:00  135.642696  ...  1013.289128     same
    33 2014-04-11 09:55:00  125.210049  ...  1138.499178     same
    19 2014-04-11 10:05:00  159.259713  ...  1297.758890     same
    52 2014-04-11 10:20:00  150.082482  ...  1447.841373     same
    

    【讨论】:

    • 嗨,mozway,为什么您在这里使用“大小”作为转换参数。大小表示行*列。为什么不只是行。
    • @user680288 不,这与df.size 不同,这意味着这里的行数,包括 NaN
    • 无论如何,transform 在 Series 上工作,所以数据是一维的
    猜你喜欢
    • 2018-05-24
    • 2018-02-28
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 2021-11-11
    相关资源
    最近更新 更多