Pandas 为 groupby 中的每一列获取三个最常见的值

我有一张这样的表:

  colour number letter
0 red    one    a
1 red    two    b
2 red    two    c
3 blue   two    a
4 blue   two    b
5 green  one    a
6 green  two    b
7 green  three  c

我做的:

df = pd.DataFrame([
    ('red', 'one', 'a'),
    ('red', 'two', 'b'),
    ('red', 'two', 'c'),
    ('blue', 'two', 'a'),
    ('blue', 'two', 'b'),
    ('green', 'one', 'a'),
    ('green', 'two', 'b'),
    ('green', 'three', 'c')
], columns=['colour', 'number', 'letter'])

我想按颜色对表格进行分组,然后为每个剩余的列获取三个最常见的值。如果一列没有三个唯一值,那么最后一个可以重复,也可以是NaN,两者都可以。输出将如下所示:

       colour  red  blue  green  
number 1       two  two   one
       2       one  two   two
       3       one  two   three
letter 1       a    a     a
       2       b    b     b
       3       c    b     c

或者:

       colour  red  blue  green  
number 1       two  two   one
       2       one  NaN   two
       3       NaN  NaN   three
letter 1       a    a     a
       2       b    b     b
       3       c    NaN   c

我已经为单列做了这个:

df.groupby('colour').number
  .value_counts()
  .groupby(level=0)
  .head(3)

输出:

colour  number  
blue    two     2
green   one     1
        two     1
        three   1
red     two     2
        one     1

但是,我想对数据框中的所有列执行此操作,并获得与示例类似的输出。我完全被困住了。

安德烈·凯斯利

尝试:

def fn(x):
    return pd.Series(
        (x.value_counts().index[:3].tolist() + [np.nan, np.nan])[:3],
        index=range(1, 4),
    )


out = pd.concat(
    [
        df.groupby("colour")[col].apply(fn).unstack(level=0).ffill()
        for col in df.loc[:, "number":]
    ],
    keys=df.loc[:, "number":],
)
print(out)

打印:

colour   blue  green  red
number 1  two  three  two
       2  two    two  one
       3  two    one  one
letter 1    b      b    b
       2    a      a    a
       3    a      c    c

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

转换pandas.groupby为dict

熊猫groupby为零值

将Pandas groupby数据行值重塑为列标题

Python Pandas,将groupby()组标签设置为新数据框中的索引

使用groupBy在Spark列中获取模式(最常见)值

使用Pandas GroupBy和value_counts查找最常见的值

Pandas groupby:根据另一列中的值更改一列中的值

布尔条件下的Groupby,在Pandas的其中一列中为True

pandas groupby并更新一列中的值大于另一列中的值的总和

groupby和求和两列并设置为pandas中的一列

在序列号上应用pandas groupby以从每一列中获取单个值

尝试使用groupby获取最常见的值并获取IndexError

将加权平均函数应用于pandas groupby对象中的列,但权重总和为零

Pandas groupby用于一列中的多个值

Groupby计为一列,Groupby计为另一列中唯一值的数量

如何使用mySQL为另一个列中的每个值返回最常见的列值?

如何使用pandas groupby()在每一列中显示2件事的值?

pandas groupby按总和汇总特定列,按最常见值汇总其他列

检查Pandas Groupby是否为空

为pandas boxplot(groupby)设置无标题

从第三列为1的另一列中的最后一个值创建pandas df列

汇总Pandas Groupby中的一列

Pandas:Groupby 中的语法

Pandas groupby 为未来值滚动

在 Pandas 中为 groupby 设置一些规则

Pandas:Groupby 总和值

GroupBy pandas DataFrame 并选择按字母顺序排列的最常见值

Pandas groupby 和聚合:为某些单元格生成唯一的单个值

pandas groupby 每组值