【问题标题】:Pandas dataframe: how to create multiple groups with combinations of rowsPandas 数据框:如何使用行组合创建多个组
【发布时间】:2021-04-26 22:10:34
【问题描述】:
         a       b       c       d
0    Apple   Apple   Apple  Banana
1    Apple   Apple  Banana   Apple
2    Apple   Apple  Banana  Banana
3    Apple  Banana  Banana  Banana
4    Apple  Banana  Banana    Pear
5    Apple  Banana    Pear   Apple
6    Apple    Pear   Apple   Apple
7    Apple    Pear  Banana   Apple
8    Apple    Pear  Banana  Banana
9   Banana  Banana    Pear  Banana
10  Banana  Banana    Pear    Pear
11  Banana    Pear  Banana   Apple
12  Banana    Pear  Banana  Banana
13    Pear   Apple  Banana  Banana
14    Pear  Banana  Banana   Apple
15    Pear  Banana    Pear    Pear
16    Pear    Pear   Apple    Pear
17    Pear    Pear  Banana   Apple
18    Pear    Pear  Banana  Banana

你好,

我有以下数据框 df。 我想创建一个新的数据框,其中包含具有两倍于“Apple”值的行组或另一组具有两倍于“Banana”值的行或一个组仅包含一次 Banana 等。我想创建数量有限的组,假设只有 6 个具有这些不同的组合。 我虽然使用 group.by 但我不确定如何在提取值时使用它。有什么帮助吗?谢谢!

【问题讨论】:

  • Avoid post image as code。您可以将您的数据框导出为文本:例如print(df.to_string(index=False),好吗?并向我们​​展示您对结果的期望?
  • 我会放在预期的桌子上方。

标签: pandas dataframe pandas-groupby


【解决方案1】:

您可以首先创建一个包含行中特定值的值计数的系列。然后按您想要的值计数过滤该系列。

以下是创建新数据框的示例,其中包含的行的值是“Apple”的两倍。

apple_count = df.apply(lambda row: row.isin(['Apple']).sum(axis=0), axis=1)

df_ = df[apple_count.isin([2, 4])]
print(df_)

       a       b       c       d
2  Apple   Apple  Banana  Banana
5  Apple  Banana    Pear   Apple
7  Apple    Pear  Banana   Apple

【讨论】:

  • 谢谢!我想那会行!!左边的索引是第一行有 Apple Apple Banana Banana 的行数吗?
  • @JessBR 不太明白你在说什么。索引是您图片左侧的数字,0,1,2,3..
  • 好的!感谢您的宝贵帮助!
  • @JessBR 要在图片中实现您想要的效果,您只需调用apple_count.value_counts() 即可获取每行中Apple 的计数。
  • 非常感谢!从您的帮助中学到了很多东西!
【解决方案2】:

理想情况下,我想要这样的东西,对不起,它应该是第 1、2、3 组等,但由于我最初的 df 排成一行很安静,所以我想要有限数量的组,之后绘制 10 个。 第 1 组将包含变量成对出现的所有行,第 2 组可以给出变量出现 3 次的所有行,第 4 组可以有所有行,其中一个变量在同一行的每一列中只出现一次,依此类推。 最后我想要的是绘制这些组的频率。

【讨论】:

    【解决方案3】:

    组团

    def count_words(values, word):
        return sum([value == word for value in values])
    
    apple_groups = df.groupby(by=lambda index: count_words(df.loc[index], 'Apple'))
    
    for word_count, group in apple_groups:
        print(group)
    
             a       b       c       d
    9   Banana  Banana    Pear  Banana
    10  Banana  Banana    Pear    Pear
    12  Banana    Pear  Banana  Banana
    15    Pear  Banana    Pear    Pear
    18    Pear    Pear  Banana  Banana
    
             a       b       c       d
    3    Apple  Banana  Banana  Banana
    4    Apple  Banana  Banana    Pear
    8    Apple    Pear  Banana  Banana
    11  Banana    Pear  Banana   Apple
    13    Pear   Apple  Banana  Banana
    14    Pear  Banana  Banana   Apple
    16    Pear    Pear   Apple    Pear
    17    Pear    Pear  Banana   Apple
    
           a       b       c       d
    2  Apple   Apple  Banana  Banana
    5  Apple  Banana    Pear   Apple
    7  Apple    Pear  Banana   Apple
    
           a      b       c       d
    0  Apple  Apple   Apple  Banana
    1  Apple  Apple  Banana   Apple
    6  Apple   Pear   Apple   Apple
    

    分组计数

    def count_rows_with_exactly_n_words(df, word, n):
        return df.apply(lambda row: count_words(row.values, word) == n, axis=1).sum()
    
    def count_word_groups(df, word, max_n):
        result = pd.DataFrame(columns=['Count'])
        for n in range(max_n + 1):
            result.at[word + '_' + str(n), 'Count'] = count_rows_with_exactly_n_words(df, word, n)
        return result
    
    print(count_word_groups(df, 'Apple', max_n=4))
    print(count_word_groups(df, 'Banana', max_n=4))
    
            Count
    Apple_0     5
    Apple_1     8
    Apple_2     3
    Apple_3     3
    Apple_4     0
    
             Count
    Banana_0     2
    Banana_1     6
    Banana_2     8
    Banana_3     3
    Banana_4     0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-19
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多