2015-11-01 40 views
1

我有一個包含多個值(從谷歌表格導入,這些列允許多個選擇)的大量列的數據集。我最初將它們作爲列表導入。熊貓:將列擴大到不同的行

現在我要分析基於從這些列的一些值的數據,即給定

df = pd.DataFrame(dict(a=[(1,2),(2,3),(1,)], b=[(1,3),(2,5),], c=['a','b','c'])) 

     a  b c 
0 (1, 2) (1, 3) a 
1 (2, 3) (2, 5) b 
2  (1)  () c 

我要繪製的條形圖,其中X是從列不同的值a和b(它們共享同一組的選項),和Y是具有選擇權的行的總數:

+0

http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – WoodChopper

+1

感謝,我重新寫的問題,包括上下文。 – Farcaller

+0

我又重新編寫了它,以指定我實際*想要獲得的內容。抱歉。 – Farcaller

回答

1

您可以通過總結列(基本上串聯的內容),然後要求他們pd.value_counts做到這一點。例如(修改您的數據幀定義略有所以它不會引發錯誤):

df = pd.DataFrame(dict(a=[(1,2),(2,3),(1,)], 
         b=[(1,3),(2,5),()], 
         c=['a','b','c'])) 
counts = pd.DataFrame({col: pd.value_counts(df[col].sum()) 
         for col in ['a', 'b']}) 
counts.plot(kind='bar') 

enter image description here


(以前的問題的答案的原始版本):

你可以使用地圖獲取2所在的所有行a

>>> df = pd.DataFrame(dict(a=[[1,2],[2,3],[1,3]], b=['a','b','c'])) 
>>> df 
     a b 
0 [1, 2] a 
1 [2, 3] b 
2 [1, 3] c 

>>> df[df.a.map(lambda L: 2 in L)] 
     a b 
0 [1, 2] a 
1 [2, 3] b 

你可以完成類似的用跟隨一個filter一個groupby,但你首先要在a值,這樣他們可哈希轉換爲一個元組(可以是組密鑰)的東西:

>>> df.groupby(df.a.map(tuple)).filter(lambda group: 2 in group.name) 
     a b 
0 [1, 2] a 
1 [2, 3] b 

一旦你有這些結果,你可以使用,例如result['a'] = 2來替換a列中的值。

+0

閱讀答案我意識到我失去了編輯時嘗試實現的實際東西。你可以再看一下嗎? – Farcaller

+0

我編輯了我的答案來回答你的新問題。 – jakevdp

1

我們可以使用布爾索引來篩選記錄,其中列'a'中沒有2

df = pd.DataFrame(dict(a=[[1,2],[2,3],[5,6]], b=['a','b','c'])) 

df 
Out[16]: 
     a b 
0 [1, 2] a 
1 [2, 3] b 
2 [5, 6] c 

df[df.a.apply(lambda x: 2 in x)] 
Out[17]: 
     a b 
0 [1, 2] a 
1 [2, 3] b 
+0

對不起,這裏的噪音。我錯誤地編輯了這個答案,而不是我自己的答案。我已經恢復了更改。 – jakevdp