我正在使用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进行数据分析,但是 使用字符串对我来说更具挑战性。)
答案 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])