2017-03-07 103 views
2

感謝你的幫助。Python的大熊貓GROUPBY多列

我有一個看起來像這樣的數據:

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 

我按城市分組,我想展示的數每個城市的每個房間類型。

任何方式蟒蛇大熊貓做到這一點?謝謝。

我SQL年前教訓,並認爲這可能是可能的。我相信Python可以做同樣的事情。謝謝!

回答

4

您可以使用crosstabrename列:

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 

另一種解決方案groupbysizevalue_counts,爲重塑使用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 
+0

非常感謝你的! –

+0

如果我或另一種答案是有幫助的,不要忘了[接受](http://meta.stackexchange.com/a/5235/295067)它。謝謝。 – jezrael

2

溶液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() 
+0

非常感謝您! –