计算同一天在熊猫数据框中发生的列表中的常见元素

时间:2018-09-01 22:42:23

标签: python pandas

我有一个看起来像这样的DataFrame:

Users               Date
['A', 'B']        2017-10-21
['B', 'C']        2017-10-21
['A', 'D']        2017-10-21
['D', 'E']        2017-10-22
['A', 'E']        2017-10-22
['A', 'E', 'D']   2017-10-22
['C', 'B', 'E']   2017-10-23
['D', 'C', 'F']   2017-11-23

我需要从此DataFrame中创建一个新的DataFrame,以计算该项目每天在列表中显示的次数。因此,计数将在同一日期跨越不同的行。

例如,新的DataFrame如下所示:

Users                        Date
[A=2, B=2, C=1, D=1]        2017-10-21
[E=3, D=2, A=2]             2017-10-22
[B=1, C=2, D=1, E=1, F=1]   2017-10-23

需要注意的一些事情:第一个数据集中的所有项目都是列表,每个元素都是字符串。日期列是日期时间类型。

我知道groupby列上会有一个Date函数,但是我不知道如何编写apply将要写的函数。

1 个答案:

答案 0 :(得分:1)

groupbyapplycollections.Counter一起使用:

df.groupby('Date').Users.sum().apply(collections.Counter, 1)

Date
2017-10-21    {'A': 2, 'B': 2, 'C': 1, 'D': 1}
2017-10-22            {'D': 2, 'E': 3, 'A': 2}
2017-10-23            {'C': 1, 'B': 1, 'E': 1}
2017-11-23            {'D': 1, 'C': 1, 'F': 1}
Name: Users, dtype: object

如果要对每个组计数多个列:

设置

s = 'ABCDE'

df = pd.DataFrame({
    'Users': [random.sample(s, random.randint(1, 5)) for _ in range(10)],
    'Tools': [random.sample(s, random.randint(1, 5)) for _ in range(10)],
    'Hours': [random.sample(s, random.randint(1, 5)) for _ in range(10)],
    'Date': ['2017-10-21', '2017-10-21', '2017-10-21', '2017-10-22',
    '2017-10-22', '2017-10-22', '2017-10-23', '2017-10-23', '2017-10-23', '2017-11-23']
})

使用agg

df.groupby('Date').sum().agg({
    'Users': collections.Counter,
    'Tools': collections.Counter,
    'Hours': collections.Counter
})

                                               Users                                     Tools                                     Hours
Date
2017-10-21  {'C': 2, 'E': 2, 'A': 2, 'B': 2, 'D': 1}  {'E': 3, 'A': 2, 'B': 3, 'D': 2, 'C': 2}  {'B': 2, 'C': 2, 'E': 1, 'A': 1, 'D': 1}
2017-10-22  {'D': 2, 'A': 2, 'E': 1, 'C': 1, 'B': 2}  {'E': 2, 'B': 3, 'A': 3, 'D': 1, 'C': 1}  {'B': 1, 'C': 2, 'E': 2, 'A': 2, 'D': 2}
2017-10-23  {'B': 2, 'A': 2, 'D': 1, 'E': 1, 'C': 2}  {'D': 3, 'E': 2, 'B': 2, 'C': 3, 'A': 2}  {'C': 3, 'E': 2, 'D': 2, 'B': 1, 'A': 2}
2017-11-23                  {'D': 1, 'B': 1, 'C': 1}                                  {'B': 1}                          {'C': 1, 'E': 1}