【问题标题】:Group Row values as Columns in Pandas在 Pandas 中将行值分组为列
【发布时间】:2019-03-29 17:57:20
【问题描述】:

我有一个记录设备温度的数据集:

Device_ID Temperature Label
1           50          0
1           40          0
2           34          0
1           78          0
2           66          1
3           88          0
1           12          0
2           33          0
3           91          0

设备可以随时发送温度。上面的数据集已经按时间排序了。

我想做什么?

根据温度模式对设备进行分类。

我已经有了数据集的标签,标签表明设备在测量后是否坏了(1 表示在此测量后设备坏了,0 表示没问题)。一旦标签变为“坏”,设备现在就永久坏了,我不需要考虑该 id 的以下测量值。

所以,我想将分类数据集构造为:

Device_ID  T1  T2 T3 T4 ... Tn Label

1          50 40 78 ...          0
2          34 66 .....           1 (33 measurement now does not matter)

所以,我的问题是如何将行中的这些时间序列值转换为 Pandas 中的列?如何有效地完成此任务

我可以使用 Pivot,但 Pivot 仅适用于分类变量。

非常感谢任何帮助。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    这是一种方法。

    使用groupby.cumcount 和每个“Device_ID”的最大标签的帮助器系列label 创建一个新的帮助器列col。然后使用DataFrame.pivotassign 你的助手系列:

    df['col'] = 'T' + (df.groupby('Device_ID').Temperature.cumcount() + 1).astype(str)
    labels = df.groupby('Device_ID')['Label'].max()
    
    df_new = df.pivot(index='Device_ID', columns='col', values='Temperature').assign(Label=labels)
    print(df_new)
    
    col          T1    T2    T3    T4  Label
    Device_ID                               
    1          50.0  40.0  78.0  12.0      0
    2          34.0  66.0  33.0   NaN      1
    3          88.0  91.0   NaN   NaN      0
    

    【讨论】:

    • 非常感谢。我怎么能不选择在选择最大标签后出现的时间序列值?即 33 不应出现在设备 id = 2 的时间序列中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2021-10-13
    • 2015-09-04
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多