这是我的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?
答案 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函数groupby
,get_group
,value_counts
,add
的建议。
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