2016-04-03 61 views
1

我使用Python 2.7(在IPython的筆記本電腦),我有以下的熊貓數據框:的Python:如何找到模式(第1欄 - 對象),由第2山坳,輸出分爲3山坳

df = pd.DataFrame({'Client': [161252, 8858, 8858, 8858, 8858, 56552, 56552], 
       'State': ['NE', 'MN', 'MN', 'TX', 'MN', 'NJ', 'WA']}) 

我想要做的是按「客戶端」對行進行分組,爲每個客戶端找到「狀態」模式,然後將輸出放到名爲「Mode_State」的新列中。 「狀態」列是一個Python對象。

我已經試過如下:

from scipy.stats import mode 
df.insert(1, 'Mode_State', ' ') 

df['Mode_State'] = df['State'].groupby(df["Client"]).transform(mode) 
df 

這將導致以下:

Client Mode_State State 
0 161252 NE   NE 
1 8858 MN   MN 
2 8858 3   MN 
3 8858 MN   TX 
4 8858 3   MN 
5 56552 [NJ]   NJ 
6 56552 [1]   WA 

我意識到scipy.stats還包括模式的數量,所以我嘗試 的以下(僅返回兩個字符的狀態信息,而不是 模式編號):

df['Mode_State'] = df['State'].groupby(df["Client"]).transform(mode[0]) 
df 

這當然給了我:

TypeError         Traceback (most recent call last) 
<ipython-input-42-1050c2b46d90> in <module>() 
     1 from scipy.stats import mode 
     2 
----> 3 df['Mode_State'] =  df['State'].groupby(df["Client"]).transform(mode[0]) 
     4 df 

TypeError: 'function' object has no attribute '__getitem__' 

我也試過StackExchange與字符串處理各方面的反應(例如lambda,agg,map等)。並得到我的第一個結果或錯誤消息的變體。如果有兩種相同的模式(例如,Client 56552具有NJ & WA),那麼結果可以作爲最低返回。

如果有人有一些提示將我指向正確的方向,我將不勝感激。我一直在通過Wes McKinney的Python進行數據分析,但使用字符串的工作方式對我來說更具挑戰性)。

回答

1
df['Mode_State'] = df.groupby('Client').State.transform(lambda group: group.mode()) 


>>> df 
    Client State Mode_State 
0 161252 NE   NE 
1 8858 MN   MN 
2 8858 MN   MN 
3 8858 TX   MN 
4 8858 MN   MN 
5 56552 NJ   NJ 
6 56552 WA   WA 
+0

謝謝亞歷山大,這對我很好。只有一個問題,客戶端56552具有相同的模式(新澤西州和新西蘭),那麼是否有辦法將答案填入最低(即新澤西州和新澤西州)? – gincard

+1

根據df.mode的文檔字符串:'獲取沿選定軸的每個元素的模式。如果沒有任何內容,則爲空 有2+個事件。爲每個標籤的每種模式添加一行,用nan填充空白 。 請注意,對於選定的軸(當多個項目共享最大頻率時),可能會返回多個值,這是返回數據幀的原因 。如果你想在數據幀''df''中將缺失值 與模式相關聯,你可以這樣做: ''''df.fillna(df.mode()。iloc [0])'' ' – Alexander

0
df['Mode_State'] =df['State'].groupby(df["Client"]).transform(lambda x: x.value_counts().index[0]) 
+0

感謝響應 - 這將返回的計數爲我(即,作爲一個數字,因此8858具有4個作爲Mode_State的每一行中的響應),而不是最常見的狀態(例如MN)。 – gincard

+0

這個工程。然而亞歷山大的提議使用內置函數(可能更快)。在某些情況下,我的解決方案可能更靈活。特別是,我認爲價值指數通過字典順序來排序並列值,所以有一個可預測性,就是哪一個最先出現。 –

+0

謝謝你,我會記住這一點,以備將來使用,並感謝你的澄清。 – gincard