首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Pandas:获取组中出现次数最多的字符串值

Pandas:获取组中出现次数最多的字符串值
EN

Stack Overflow用户
提问于 2018-07-11 22:55:21
回答 3查看 2.1K关注 0票数 4

我有以下DataFrame:

代码语言:javascript
复制
item    response
1       A       
1       A       
1       B       
2       A       
2       A   

我想添加一个列,其中包含针对某项的最多给定响应。这应该会导致:

代码语言:javascript
复制
item    response  mostGivenResponse
1       A          A
1       A          A      
1       B          A       
2       C          C
2       C          C

我尝试了这样的东西:

代码语言:javascript
复制
df["responseCount"] = df.groupby(["ItemCode", "Response"])["Response"].transform("count")

df["mostGivenResponse"] = df.groupby(['ItemCode'])['responseCount'].transform(max)

但是mostGivenResponse现在是响应的计数,而不是响应本身。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-11 22:57:36

使用value_counts并返回第一个索引值:

代码语言:javascript
复制
df["responseCount"] = (df.groupby("item")["response"]
                        .transform(lambda x: x.value_counts().index[0]))

print (df)
   item response responseCount
0     1        A             A
1     1        A             A
2     1        B             A
3     2        C             C
4     2        C             C

collections.Counter.most_common

代码语言:javascript
复制
from collections import Counter

df["responseCount"] = (df.groupby("item")["response"]
                         .transform(lambda x: Counter(x).most_common(1)[0][0]))

print (df)
   item response responseCount
0     1        A             A
1     1        A             A
2     1        B             A
3     2        C             C
4     2        C             C

编辑:

问题是一个或多个NaN的唯一组,解决方案是使用if-else筛选

代码语言:javascript
复制
print (df)
   item response
0     1        A
1     1        A
2     2      NaN
3     2      NaN
4     3      NaN

def f(x):
    s = x.value_counts()
    print (s)

    A    2
    Name: 1, dtype: int64
    Series([], Name: 2, dtype: int64)
    Series([], Name: 3, dtype: int64)

    #return np.nan if s.empty else s.index[0]
    return np.nan if len(s) == 0 else s.index[0]

df["responseCount"] = df.groupby("item")["response"].transform(f)
print (df)
   item response responseCount
0     1        A             A
1     1        A             A
2     2      NaN           NaN
3     2      NaN           NaN
4     3      NaN           NaN
票数 3
EN

Stack Overflow用户

发布于 2018-07-11 22:58:46

有一个pd.Series.mode

代码语言:javascript
复制
df.groupby('item').response.transform(pd.Series.mode)
Out[28]: 
0    A
1    A
2    A
3    C
4    C
Name: response, dtype: object
票数 9
EN

Stack Overflow用户

发布于 2018-07-11 23:08:18

您可以使用标准库中的statistics.mode

代码语言:javascript
复制
from statistics import mode

df['mode'] = df.groupby('item')['response'].transform(mode)

print(df)

   item response mode
0     1        A    A
1     1        A    A
2     1        B    A
3     2        C    C
4     2        C    C
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51288635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档