Pandas Dataframe 根据一列中的唯一值复制具有平均值的行,以便每个唯一值具有相同的行数

邢文森

我有一个如下所示的数据框:

import numpy as np
import pandas as pd
df = pd.DataFrame({"Colum1":

               ["A", "A", "A", "A", "B", "B", "B", "C", "C", "D"],

               "Colum2": [24., 25, 21., 33, 26, 24., 25, 21., 33, 26],

               "Colum3": [0.2, 0.3, 0.4, 0.5, 0.6, 0.2, 0.3, 0.4, 0.5, 0.6]})
  Colum1  Colum2  Colum3
0      A    24.0     0.2
1      A    25.0     0.3
2      A    21.0     0.4
3      A    33.0     0.5
4      B    26.0     0.6
5      B    24.0     0.2
6      B    25.0     0.3
7      C    21.0     0.4
8      C    33.0     0.5
9      D    26.0     0.6

这里我有 4 行对应 A,3 行对应 B,2 对应 C,1 对应 D。

如何添加 B、C 和 D 的行,使其具有与 A 相同的数字以使用它们的平均值有 4 行?例如,colum2 的 B 平均值为 (26+25+24)/3 = 25,colum3 的平均值为 (0.6+0.2+0.3)/3 = 0.37 所以我添加一行 B 25 0.37

对于 C,只有 2 行,第 2 列和第 3 列的平均值是 27 和 0.45,所以我添加了两行 C 27 0.45

对于 D 只有一行,所以我们添加三个具有相同值的行

目标是:

  Colum1  Colum2  Colum3
0      A    24.0     0.2
1      A    25.0     0.3
2      A    21.0     0.4
3      A    33.0     0.5
4      B    26.0     0.6
5      B    24.0     0.2
6      B    25.0     0.3
7      B    25.0     0.37
8      C    21.0     0.4
9      C    33.0     0.5
10     C    27.0     0.45
11     C    27.0     0.45
12     D    26.0     0.6
13     D    26.0     0.6
14     D    26.0     0.6
15     D    26.0     0.6

舒巴姆·夏尔马

解决方案

g = df.groupby('Colum1')
avg, s = g.mean(), g.size()
rows = avg.loc[avg.index.repeat(s.max() - s)]

pd.concat([df, rows.reset_index()]).sort_values('Colum1')

解释

计算每组的meansize

>>> avg
        Colum2    Colum3
Colum1                  
A        25.75  0.350000
B        25.00  0.366667
C        27.00  0.450000
D        26.00  0.600000

>>> s
Colum1
A    4
B    3
C    2
D    1
dtype: int64

Repeat数据帧的行avgN 次,其中 N 是通过从最大组大小中减去每个组的大小来获得的

>>> rows
        Colum2    Colum3
Colum1                  
B         25.0  0.366667
C         27.0  0.450000
C         27.0  0.450000
D         26.0  0.600000
D         26.0  0.600000
D         26.0  0.600000

Concat采样的原始数据帧rows以获得具有平衡组分布的数据帧

  Colum1  Colum2    Colum3
0      A    24.0  0.200000
1      A    25.0  0.300000
2      A    21.0  0.400000
3      A    33.0  0.500000
4      B    26.0  0.600000
5      B    24.0  0.200000
6      B    25.0  0.300000
0      B    25.0  0.366667
7      C    21.0  0.400000
8      C    33.0  0.500000
1      C    27.0  0.450000
2      C    27.0  0.450000
9      D    26.0  0.600000
3      D    26.0  0.600000
4      D    26.0  0.600000
5      D    26.0  0.600000

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从 Pandas Dataframe 中查找列中的唯一值,并查看这些值是否在另一列中具有相同的值

从 Pandas Dataframe 中选择一列中具有相同值而另一列中仅丢失的行

如何基于Pandas中特定值的一列转换仅在一列中仅具有唯一值的DataFrame

如何以Python方式返回具有唯一列Pandas DataFrame的非nan值的df

对唯一列值进行分组以获取 Pandas 数据框列中每个唯一值的平均值

Pandas DataFrame-删除特定列中与上一行具有相同值的行

pandas DataFrame-在不对每个索引标签进行硬编码的情况下,为每个唯一索引计算一列的平均值?

Python Pandas DataFrame:查找另一列的每个唯一值的最大值

Pandas DataFrame:计算一列中第二列内容相同的那些行的平均值?

基于唯一列值的dict项替换pandas DataFrame中的行

pandas-计算每个列中每个唯一值在DataFrame中出现的值

平均值函数,不包括Pandas DataFrame中每一行的值

使用同一列中与另一列中具有匹配值的值填充Pandas DataFrame中的空值

从一列中的唯一值创建 Pandas DataFrame

列中有列表对象时获取pandas Dataframe中唯一值的计数

Pandas - 根据后一列中是否存在值过滤一列中具有相同值和另一列中多个值的行

根据列中的唯一值从 Pandas DataFrame 列创建字典

如何为Pandas DataFrame中找到的所有唯一值设置相同的频率?

如何将pandas DataFrame压缩成具有唯一键和列出值的字典?

根据另一个具有相同索引/列名称的DataFrame中的值在Pandas DataFrame中设置单元格值

計算 Pandas 中具有相同列值的行的平均值

检查pandas DataFrame中的两行是否具有相同的一组值,无论列顺序如何

Pandas Dataframe:如何创建另一列的增量唯一值计数的列

在B列中找到这些值的平均值,这些值位于A列中K个最大元素之一的行中:Pandas Dataframe GroupBy对象

Pandas:具有另一列唯一值索引的新列

Pandas DataFrame:添加具有基于前一行计算值的新列

在第一列相同的所有行中找到Pandas,Python中的最小值,最大值,平均值

在 Pandas DataFrame 中创建一个具有特定值的列

根据对列中每个不同值具有特定条件的行,在Pandas Dataframe中计算perc