在Pandas Dataframes中对列数据进行分组

时间:2017-09-25 10:13:52

标签: python pandas

我有一个包含许多列的熊猫数据框(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

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

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

因此 df_length 数据框应如下所示:

Timestamp     Length
0             25
5             25

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

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

我想我可以在某些条件下使用df.groupby来获取它。但现在感到困惑和疲惫:(

  

仅使用熊猫功能欣赏解决方案。

1 个答案:

答案 0 :(得分:1)

您可以为Source的group MultiIndex 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