2016-06-19 133 views
2

GROUPBY在多個列數我已經在Python下面的示例數據幀大熊貓:如何大熊貓

+---+------+------+------+ 
| | col1 | col2 | col3 | 
+---+------+------+------+ 
| 0 | a | d | b | 
+---+------+------+------+ 
| 1 | a | c | b | 
+---+------+------+------+ 
| 2 | c | b | c | 
+---+------+------+------+ 
| 3 | b | b | c | 
+---+------+------+------+ 
| 4 | a | a | d | 
+---+------+------+------+ 

我想執行的所有「一」,「B A計數」,「C,跨所以列1-3'和‘d’的值,我將結束了這樣一個數據幀:

我可以做到這一點
+---+--------+-------+ 
| | letter | count | 
+---+--------+-------+ 
| 0 | a | 4 | 
+---+--------+-------+ 
| 1 | b | 5 | 
+---+--------+-------+ 
| 2 | c | 4 | 
+---+--------+-------+ 
| 3 | d | 2 | 
+---+--------+-------+ 

一種方式是堆疊在彼此的頂部上的列,然後做一個GROUPBY計數,但我覺得必須有更好的方法。有人可以幫我弄這個嗎?

回答

4

可以stack()數據幀將所有列轉換爲行,然後做value_counts

df.stack().value_counts() 

b 5 
c 4 
a 4 
d 2 
dtype: int64 
+0

非常感謝,這是真正有用的 – lollerskates

1

可以applyvalue_countssum

print (df.apply(pd.value_counts)) 
    col1 col2 col3 
a 3.0  1 NaN 
b 1.0  2 2.0 
c 1.0  1 2.0 
d NaN  1 1.0 

df1 = df.apply(pd.value_counts).sum(1).reset_index() 
df1.columns = ['letter','count'] 
df1['count'] = df1['count'].astype(int) 
print (df1) 
    letter count 
0  a  4 
1  b  5 
2  c  4 
3  d  2