【问题标题】:Grouping column data in Pandas Dataframes在 Pandas Dataframes 中对列数据进行分组
【发布时间】:2018-03-06 06:38:15
【问题描述】:

我有一个包含许多列的 Panda 数据框 (df)。为简单起见,我在此处发布了三列包含虚拟数据的列。

Timestamp    Source    Length
0            1              5
1            1              5
2            1              5
3            2              5
4            2              5
5            3              5
6            1              5
7            3              5
8            2              5
9            1              5

使用 Panda 函数,首先我将时间戳设置为 df 的索引。

index = pd.DatetimeIndex(data[data.columns[1]]*10**9) # Convert timestamp
df = df.set_index(index) # Set Timestamp as index

接下来我可以使用 groupbypd.TimeGrouper 函数将数据分组到 5 秒的 bin 中,并计算每个 bin 的累积长度,如下所示:

df_length = data[data.columns[5]].groupby(pd.TimeGrouper('5S')).sum()

所以 df_length 数据框应该如下所示:

Timestamp     Length
0             25
5             25

现在的问题是:“我想获得相同的 5 秒箱,但 ant 以下列格式在单独的列中计算每个源(1,2 和 3)的累积长度:

Timestamp    1     2     3
0            15    10    0
5            10    5     10

我想我可以在某些条件下使用 df.groupby 来获得它。但是现在又迷茫又累了:(

欣赏仅使用 panda 函数的解决方案。

【问题讨论】:

  • 您的“虚拟数据”没有 5 列,因此您的 df_length 函数将不起作用

标签: python pandas


【解决方案1】:

您可以为 groupby SourceMultiIndex DataFrame 添加新列,然后通过unstack 为列的最后一级MultiIndex 重塑:

print (df[df.columns[2]].groupby([pd.TimeGrouper('5S'), df['Source']]).sum())
Timestamp            Source
1970-01-01 00:00:00  1         15
                     2         10
1970-01-01 00:00:05  1         10
                     2          5
                     3         10
Name: Length, dtype: int64

df1 = df[df.columns[2]].groupby([pd.TimeGrouper('5S'), df['Source']])
                       .sum()
                       .unstack(fill_value=0)
print (df1)
Source                1   2   3
Timestamp                      
1970-01-01 00:00:00  15  10   0
1970-01-01 00:00:05  10   5  10

【讨论】:

  • 我本来建议使用数据透视表,但这要好得多。干得好!
  • 非常感谢。有用!但是请您解释一下代码,它是如何工作的,因为我的数据可能会遇到一些其他类似的分组问题。
猜你喜欢
  • 2017-10-09
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
相关资源
最近更新 更多