首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在groupby和平均DataFrame之后保留所有列

如何在groupby和平均DataFrame之后保留所有列
EN

Stack Overflow用户
提问于 2020-08-28 05:46:12
回答 1查看 44关注 0票数 2

我有一个名为‘data’的数据帧:

代码语言:javascript
复制
     USER  VALUE VALUE2
0    XOXO     21    AAA
1   ABC-1      2    BBB
2  ABC-1B      4    CCC
3   ABC-2      4    DDD
4  ABC-2B      6    EEE
5    PEPE     12    FFF

我通过一些代码来组合相似的名称:

代码语言:javascript
复制
data = pd.DataFrame({'USER':['XOXO','ABC-1','ABC-1B','ABC-2','ABC-2B', 'PEPE'], 'VALUE':[21,2,4,4,6,12], 'VALUE2':['AAA','BBB','CCC','DDD','EEE', 'FFF']})
data.USER = data.USER.str.replace('(-\d)B', r"\1")
data = data.groupby('USER', as_index=False, sort=False).VALUE.mean()

然而,我最终得到了一个数据帧,就像这样,删除了VALUE2:

代码语言:javascript
复制
    USER  VALUE
0   XOXO     21
1  ABC-1      3
2  ABC-2      5
3   PEPE     12

如何通过保留原始用户的VALUE2来修改代码以保留VALUE2?因此,用户'ABC-1‘的VALUE2将保留为'BBB’,'ABC-2‘将保留为'DDD’

代码语言:javascript
复制
    USER  VALUE   VALUE2
0   XOXO     21      AAA
1  ABC-1      3      BBB
2  ABC-2      5      DDD
3   PEPE     12      FFF
EN

回答 1

Stack Overflow用户

发布于 2020-08-28 06:16:18

去掉尾部B后按USER分组。然后使用.str.contains().isin()实现适当的布尔值选择并过滤最终数据帧。

代码语言:javascript
复制
  df['VALUE']=df[['USER', 'VALUE', 'VALUE2']].groupby(df.USER.str.split('(?<=[1-2])(B)').str[0])['VALUE'].transform('mean')
   df[~((df.USER.str.contains('ABC'))&(~df.VALUE2.isin(['BBB','DDD'])))]

      
        USER  VALUE VALUE2
    0   XOXO     21    AAA
    1  ABC-1      3    BBB
    3  ABC-2      5    DDD
    5   PEPE     12    FFF

如何工作

代码语言:javascript
复制
#Strip trailing B in USER
df.USER=df.USER.str.split('(?<=[1-2])(B)').str[0]

    USER  VALUE VALUE2
0   XOXO     21    AAA
1  ABC-1      2    BBB
2  ABC-1      4    CCC
3  ABC-2      4    DDD
4  ABC-2      6    EEE
5   PEPE     12    FFF

# groupby变换求平均值

代码语言:javascript
复制
df['VALUE']=df.groupby(df.USER.str.split('(?<=[1-2])(B)').str[0])['VALUE'].transform('mean')
print(df)

USER  VALUE VALUE2
0   XOXO     21    AAA
1  ABC-1      3    BBB
2  ABC-1      3    CCC
3  ABC-2      5    DDD
4  ABC-2      5    EEE
5   PEPE     12    FFF

#Boolean选择任何包含ABC(df.USER.str.contains('ABC'))但没有BBBDDD(~df.VALUE2.isin(['BBB','DDD']))的内容

#合并两个选择,然后使用~反转选择

代码语言:javascript
复制
~((df.USER.str.contains('ABC'))&(~df.VALUE2.isin(['BBB','DDD'])))

#Finally过滤数据帧

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63624546

复制
相关文章

相似问题

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