在pandas中总结group value_counts的最佳方法

时间:2014-05-17 09:38:59

标签: python pandas

这是我的DataFrame:

id b1 b2 b3 c
-------------
 1 aa bb cc a
 2 ac bc cd b
 3 ac ad cc a
 4 ad cd ae b

b1 b2和b3是3个col具有相同的含义。现在我想按col c对数据进行分组,并计算b1 b2和b3中单词的value_counts()。这是我的代码:

grp = df.groupby('c')
vc1 = grp['b1'].value_counts()
vc2 = grp['b2'].value_counts()
vc3 = grp['b3'].value_counts()

sum([vc1, vc2, vc3])

但结果中有很多NA。如何将默认值设置为0?

2 个答案:

答案 0 :(得分:2)

这是一个非常有效的方法

分组' c'列,并考虑要传递给apply除了c的所有列(这是df.columns-['c']的作用,通常将分组列IS传递给apply。

然后简单value_counts对所有数据(ravel将2-d展平为1-d)无论如何都要总计。

In [92]: df.groupby('c')[df.columns - ['c']].apply(lambda x: x.unstack().value_counts())
Out[92]: 
c    
a  cc    2
   bb    1
   ad    1
   ac    1
   aa    1
b  cd    2
   ad    1
   ae    1
   ac    1
   bc    1
dtype: int64

如果你想作为列

In [97]: df.groupby('c')[df.columns - ['c']].apply(lambda x: x.unstack().value_counts()).unstack().T.fillna(0)
Out[97]: 
c   a  b
aa  1  0
ac  1  1
ad  1  1
ae  0  1
bb  1  0
bc  0  1
cc  2  0
cd  0  2

答案 1 :(得分:0)

以下是基于pandas函数groupbyget_groupvalue_countsadd的建议。

import pandas as pd
# Creation of the dataframe example
df = pd.DataFrame.from_dict({'b1':['aa','ac','ac','ad'],\
                             'b2':['bb','bc','ad','cd'],\
                             'b3':['cc','cd','cc','ae'],\
                             'c' :['a','b','a','b']})
# Group data wrt column c
grp = df.groupby('c')
# Create empty dataframe that will hold results
dfc = pd.DataFrame()
# Iterate over all groups
for g in grp.groups:
    # Select the current group
    cg = grp.get_group(g)
    # Iterate over all columns to be counted
    for c in ['b1','b2','b3']:
        # Perform all value_counts and
        # add result to the correct column in result dataframe
        dfc = dfc.add(pd.DataFrame({g:cg[c].value_counts()}),fill_value=0)
# Replace all Nan with 0
dfc.fillna(0, inplace = True)

结果将如下所示

    a  b
aa  1  0
ac  1  1
ad  1  1
ae  0  1
bb  1  0
bc  0  1
cc  2  0
cd  0  2