计算列

时间:2017-07-28 01:05:32

标签: python pandas jupyter-notebook

我的数据框df带有一个名为“groups”的列。它看起来像下面 -

groups
[u'CN=MyUsers,OU=Groups,DC=sample,DC=com',u'CN=Sample-Users,OU=Groups,DC=sample,DC=com']
[u'CN=MyUsers,OU=Groups,DC=sample,DC=com',u'CN=Sample-Users,OU=Groups,DC=sample,DC=com',u'CN=MoreUsers,OU=Groups,DC=sample,DC=com']

第一行包含2组,第二行包含3组。我想计算整列中每个唯一组的数量。所以我的结果数据框应该说 -

Group                                         Count
u'CN=MyUsers,OU=Groups,DC=sample,DC=com'       2
u'CN=Sample-Users,OU=Groups,DC=sample,DC=com'  2
u'CN=MoreUsers,OU=Groups,DC=sample,DC=com'     1

我将如何完成此任务。我在尝试 -

res=df.groups.apply(pd.Series).stack().value_counts()

但这并没有给我预期的结果。这不会影响个别群体的数量。

2 个答案:

答案 0 :(得分:1)

对于列中的每个元素,您可以执行以下操作:

#if column1 = [u'CN=MyUsers,OU=Groups,DC=sample,DC=com',u'CN=Sample-Users,OU=Groups,DC=sample,DC=com']
#if column2 = [u'CN=MyUsers,OU=Groups,DC=sample,DC=com',u'CN=Sample-Users,OU=Groups,DC=sample,DC=com',u'CN=MoreUsers,OU=Groups,DC=sample,DC=com']

count_dict = dict()
for column in YOUR_DATA_SHEET:
    for element in column:
        if element in count_dict.keys():
            count_dict[element] += 1
        else:
            count_dict[element] = 1

这样你就可以有一个字典来记录元素及其数量。

答案 1 :(得分:1)

这应该有效:

from itertools import chain

pd.DataFrame(map(lambda x: (x, 1), chain.from_iterable(df.groups.values))).groupby(0, as_index=False).sum().rename(columns={0:'Group', 1:'Count'})

                                        Group  Count
0     CN=MoreUsers,OU=Groups,DC=sample,DC=com      1
1       CN=MyUsers,OU=Groups,DC=sample,DC=com      2
2  CN=Sample-Users,OU=Groups,DC=sample,DC=com      2

也是这样的:

pd.DataFrame(list(chain.from_iterable(df.groups.values)), columns=['Group']).Group.value_counts()

CN=Sample-Users,OU=Groups,DC=sample,DC=com    2
CN=MyUsers,OU=Groups,DC=sample,DC=com         2
CN=MoreUsers,OU=Groups,DC=sample,DC=com       1

时间测试:

%timeit pd.DataFrame(list(chain.from_iterable(df.groups.values)), columns=['Group']).Group.value_counts()

1000 loops, best of 3: 899 µs per loop

%timeit pd.DataFrame(list(chain.from_iterable(df.groups.values))).groupby(0, as_index=False).sum().rename(columns={0:'Group', 1:'Count'})

100 loops, best of 3: 5.5 ms per loop