[英]Python Pandas groupby multiple columns
谢谢您的帮助。
我的数据看起来像这样:
city, room_type
A, X
A, Y
A, Z
B, X
B, Y
B, Y
我希望我的最终结果看起来像这样:
city, count(X), count(Y), count(z)
A, 1, 1, 1
B, 1, 2, 0
我按城市分组,我想显示每个城市中每个room_type的数量。
用python pandas做任何方法吗? 谢谢。
我在几年前学过SQL,并认为它可能是可能的。 我相信python可以做同样的事情。 谢谢!
您可以使用带有rename
列的crosstab
表:
df = pd.crosstab(df.city, df.room_type).rename(columns=lambda x: 'count({})'.format(x))
print (df)
room_type count(X) count(Y) count(Z)
city
A 1 1 1
B 1 2 0
使用groupby
和size
或value_counts
进行重新groupby
另一个解决方案是使用unstack
:
df = df.groupby(['city', 'room_type']).size().unstack(fill_value=0)
.rename(columns=lambda x: 'count({})'.format(x))
print (df)
room_type count(X) count(Y) count(Z)
city
A 1 1 1
B 1 2 0
df = df.groupby('city')['room_type'].value_counts().unstack(fill_value=0)
.rename(columns=lambda x: 'count({})'.format(x))
print (df)
room_type count(X) count(Y) count(Z)
city
A 1 1 1
B 1 2 0
一个解决方案jezrael没有给;-)
s = pd.value_counts([tuple(i) for i in df.values.tolist()])
s.index = pd.MultiIndex.from_tuples(s.index.values, names=['city', None])
s.unstack(fill_value=0).rename(columns='count({})'.format).reset_index()
city count(X) count(Y) count(Z)
0 A 1 1 1
1 B 1 2 0
更多地参与
cities = pd.unique(df.city)
room_types = pd.unique(df.room_type)
d1 = pd.DataFrame(
np.zeros((len(cities), len(room_types)), dtype=int),
cities,
room_types
)
for r, c in df.values:
d1.set_value(r, c, d1.get_value(r, c) + 1)
d1.rename(columns='count({})'.format).rename_axis('city').reset_index()
第一种解决方案的变化
from collections import Counter
pd.Series(
Counter(map(tuple, df.values.tolist()))
).unstack(fill_value=0).rename(
columns='count({})'.format
).rename_axis('city').reset_index()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.