2016-04-03 2 views
1

私は(iPythonノートブック内)のPython 2.7を使用していると私は、次のパンダのデータフレームを持っている:Pythonの:どのモード(第一COL - オブジェクト)を見つけるために、第二COLによってグループ化し、出力第三COLへ

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

私がしたいのは、 "クライアント"によって行をグループ化し、各クライアントの "状態"のモードを見つけて、 "Mode_State"という新しい列に出力を配置することです。 "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もモードの数が含まれていることを実現するので、私が試した ( のモード番号ではなく、2文字の状態情報を返すだけです)。

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上の様々な反応をも試してみました。もちろん私に与えた

ラムダ、アグ、地図など)。私の最初の結果やエラーメッセージが変わってきています。等しいモードが2つある場合(たとえば、クライアント56552にNJ & WAがある場合)、結果が最も低いものとして返されても問題ありません。

誰かが正しい方向で私を指すヒントを持っていると感謝します。

ありがとうございます(もちろん、まだPythonを勉強していないので経験はあまりありません)。データ分析のための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には同じモード(NJ&WA)がありますので、答えが最も低い(NJ&NJ)のように設定する方法がありますか? – 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はMode_Stateの各行の応答として4を有している、即ち数として)私のためにカウントを返していない最も一般的な状態(例えばMN)。 – gincard

+0

これは機能します。しかし、Alexanderの提案では、組み込み関数を使用しています(おそらくより速い)。私のソリューションは、場合によってはより柔軟性があります。特に、私はバリュー・カウントがレキシコグラフィーの順序で結び付けられた値を並べ替えると考えています。そのため、どちらが最初に来るかについての予測可能性があります。 –

+0

これをありがとう、私は将来の使用のためにこれを念頭に置いて、あなたの明確化を感謝します。 – gincard

関連する問題