我有pandas数据框网址,如
location dom_category
3 'edu'
3 'gov'
3 'edu'
4 'org'
4 'others'
4 'org'
我希望这个数据框像
location edu gov org others
3 2 1 0 0
4 0 0 2 1
edu,gov,org和其他人包含特定位置的计数。
我有正确的代码,但我知道它不是优化的
url['val']=1
url_final=url.pivot_table(index=['location'],values='val',columns=
['dom_category'],aggfunc=np.sum)
答案 0 :(得分:4)
首先,如有必要,请str.strip
删除'
。
然后使用groupby
汇总size
并重新塑造unstack
:
df['dom_category'] = df['dom_category'].str.strip("\'")
df = df.groupby(['location','dom_category']).size().unstack(fill_value=0)
print (df)
dom_category edu gov org others
location
3 2 1 0 0
4 0 0 2 1
或使用pivot_table
:
df['dom_category'] = df['dom_category'].str.strip("\'")
df=df.pivot_table(index='location',columns='dom_category',aggfunc='size', fill_value=0)
print (df)
dom_category edu gov org others
location
3 2 1 0 0
4 0 0 2 1
最后可以将索引转换为列,并按reset_index
+ rename_axis
删除列名dom_category
:
df = df.reset_index().rename_axis(None, axis=1)
print (df)
location edu gov org others
0 3 2 1 0 0
1 4 0 0 2 1
答案 1 :(得分:3)
使用groupby
和value_counts
众议院
摆脱 '
df.dom_category = df.dom_category.str.strip("'")
其余解决方案
df.groupby('location').dom_category.value_counts().unstack(fill_value=0)
dom_category edu gov org others
location
3 2 1 0 0
4 0 0 2 1
要使格式恰到好处
df.groupby('location').dom_category.value_counts().unstack(fill_value=0) \
.reset_index().rename_axis(None, 1)
location edu gov org others
0 3 2 1 0 0
1 4 0 0 2 1
答案 2 :(得分:2)
让我们使用str.strip
,get_dummies
和groupby
:
df['dom_category'] = df.dom_category.str.strip("\'")
df.assign(**df.dom_category.str.get_dummies()).groupby('location').sum().reset_index()
输出:
location edu gov org others
0 3 2 1 0 0
1 4 0 0 2 1