【问题标题】:New dataframe which contais a certain value within each group在每个组中包含某个值的新数据框
【发布时间】:2023-03-16 06:20:01
【问题描述】:

我有一个如下的数据框

User    eve Ses
a   123 1
a   123 2
a   123 3
a   123 4
a   123 5
a   123 6
a   456 1
a   456 2
a   456 3
a   456 4
a   456 5
a   456 14
a   456 7
a   456 8
a   456 9
a   456 10
a   888 1
a   888 2
a   888 3
a   888 4
a   888 5
a   888 5
a   888 7
a   888 8
b   123 1
b   123 2
b   123 3
b   123 4
b   123 5
b   123 6
b   456 1
b   456 2
b   456 3
b   456 4
b   456 5
b   456 9
b   456 7
b   456 8
b   456 9
b   456 10
b   888 1
b   888 2
b   888 3
b   888 4
b   888 5
b   888 6
b   888 7
b   888 8

我想按 Usereve 分组,并获得一个包含所有包含 6 或 14 的组的新数据框

当我使用下面的代码时

df.groupby(['User','eve']).apply(lambda x: (x['Ses']==6).any()|(x['Ses']==14).any()) 我准确地得到了下面有 6 个或 14 个的组

User  eve
a     123     True
      456     True
      888    False
b     123     True
      456    False
      888     True
dtype: bool

我只是无法使用此信息来获取包含True 组的新数据框。 预期的输出是新的数据框,如下所示。谁能指导一下?

User    eve Ses
a   123 1
a   123 2
a   123 3
a   123 4
a   123 5
a   123 6
a   456 1
a   456 2
a   456 3
a   456 4
a   456 5
a   456 14
a   456 7
a   456 8
a   456 9
a   456 10
b   123 1
b   123 2
b   123 3
b   123 4
b   123 5
b   123 6
b   888 1
b   888 2
b   888 3
b   888 4
b   888 5
b   888 6
b   888 7
b   888 8

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-groupby


    【解决方案1】:

    为了提高性能,可以使用 GroupBy.transformGroupBy.any 创建掩码 Series.isin 和由 DataFrame.assign 创建的辅助列:

    df = df[df.assign(m=df['Ses'].isin([6,14])).groupby(['User','eve'])['m'].transform('any')]
    print (df)
       User  eve  Ses
    0     a  123    1
    1     a  123    2
    2     a  123    3
    3     a  123    4
    4     a  123    5
    5     a  123    6
    6     a  456    1
    7     a  456    2
    8     a  456    3
    9     a  456    4
    10    a  456    5
    11    a  456   14
    12    a  456    7
    13    a  456    8
    14    a  456    9
    15    a  456   10
    24    b  123    1
    25    b  123    2
    26    b  123    3
    27    b  123    4
    28    b  123    5
    29    b  123    6
    40    b  888    1
    41    b  888    2
    42    b  888    3
    43    b  888    4
    44    b  888    5
    45    b  888    6
    46    b  888    7
    47    b  888    8
    

    你的解决方案应该改成DataFrameGroupBy.filter,但是如果更大的DataFrame或者很多组的解决方案真的很慢:

    df = df.groupby(['User','eve']).filter(lambda x: (x['Ses']==6).any()|(x['Ses']==14).any())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多