Python:如何找到模式(1st col - object),按第2列分组,输出到第3列

时间:2016-04-03 01:36:13

标签: python python-2.7 object pandas

我正在使用Python 2.7(在iPython Notebook中),我有以下pandas DataFrame:

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还包含模式的编号,所以我试过了 以下(只是为了返回两个字符的状态信息,而不是 模式号码):

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等)。并得到我的第一个结果或错误消息的变化。如果有两个相同的模式(例如,客户端56552具有NJ和WA),则可以将结果作为最低值返回。

如果有人有一些提示让我指出正确的方向,我将不胜感激。

谢谢(注意,我显然还在学习Python,所以我的经验不是很好。一直在通过Wes McKinney的Python进行数据分析,但是 使用字符串对我来说更具挑战性。)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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