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

D. *_*que 2 python loops vectorization dataframe pandas

我正在尝试将三个 pandas DataFrame 组合在一起

其中一个(称为major)有一列category,其中每一行都有一个唯一的标签:

major_df = pd.DataFrame(np.random.randint(0, 100, size=(3, 2)), columns=list("AB"))
major_df["category"] = pd.Series(["cat_A", "cat_B", "cat_C"])
Run Code Online (Sandbox Code Playgroud)
    A   B category
0  90  17    cat_A
1  36  81    cat_B
2  90  67    cat_C
Run Code Online (Sandbox Code Playgroud)

另外两个 dfs(称为minor)包含多行并具有自己唯一的列名称。每个 df 都有一个列category,其中每行都有一个出现在主要 df 类别列中的值:

    A   B category
0  90  17    cat_A
1  36  81    cat_B
2  90  67    cat_C
Run Code Online (Sandbox Code Playgroud)

下面是这些次要 dfs 之一的示例。两者之间的唯一区别是第一个次要 df 具有列CD,第二个具有列EF

    C   D category
0  71  44    cat_C
1   5  88    cat_C
2   8  78    cat_C
3  31  27    cat_C
4  42  48    cat_B
5  18  18    cat_B
6  84  23    cat_A
7  94  23    cat_A
Run Code Online (Sandbox Code Playgroud)

因此,我的目标是根据类别列计算次要 dfs 中的值的平均值,以便最后得到以下 dfs :

           C      D
cat_A  89.00  23.00
cat_B  30.00  33.00
cat_C  28.75  59.25
Run Code Online (Sandbox Code Playgroud)

其中每列包含每个类别中的值的平均值。


为此,我编写了以下代码,其中我们使用次要 dfs 的列值和来自不同类别值的索引创建空 DataFrame。然后,我使用 for 循环填充此 DataFrame,在该循环中迭代索引的每个值。

minor_dfs = {}
for k, cols in zip(("1st", "2nd"), ("CD", "EF")):
    minor_dfs[k] = pd.DataFrame(np.random.randint(0, 100, size=(8, 2)), columns=list(cols))
    minor_dfs[k]["category"] = np.random.choice(["cat_A", "cat_B", "cat_C"], 8)
Run Code Online (Sandbox Code Playgroud)

然而,我认为可以使用矢量化操作来优化这段代码,特别是在我迭代每一行的部分。所以我想知道是否有一种更简单、更聪明的方法来完成我想做的事情?

小智 5

这?

import pandas as pd

df = pd.read_excel('test.xlsx')
df1 = df.groupby(['category']).mean()
print(df)
print(df1)
Run Code Online (Sandbox Code Playgroud)

输出:

    C   D category
0  71  44    cat_C
1   5  88    cat_C
2   8  78    cat_C
3  31  27    cat_C
4  42  48    cat_B
5  18  18    cat_B
6  84  23    cat_A
7  94  23    cat_A


              C      D
category
cat_A     89.00  23.00
cat_B     30.00  33.00
cat_C     28.75  59.25
Run Code Online (Sandbox Code Playgroud)