【问题标题】:Compute mean value of rows that has the same column value in Pandas计算 Pandas 中具有相同列值的行的平均值
【发布时间】:2022-01-08 06:10:03
【问题描述】:

我正在尝试将三个 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"])
    A   B category
0  90  17    cat_A
1  36  81    cat_B
2  90  67    cat_C

另外两个 dfs(称为 minor) contains multiple rows and have their own unique column names. Each df has a column category`,其中每一行都有一个值存在于主要 df 类别列中:

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)

这是其中一个次要 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

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

           C      D
cat_A  89.00  23.00
cat_B  30.00  33.00
cat_C  28.75  59.25

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


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

copy_dfs = {}
for k, min_df in minor_dfs.items():
    # Get columns from minor df
    # Get index from category of major df
    col_names = min_df.columns.values
    ind_values = major_df.category.values

    # Create a df with columns and indices and set values to np.nan
    copy_df = pd.DataFrame(np.nan, index=ind_values, columns=col_names)
    copy_df = copy_df.drop("category", axis=1)

    # For each category in the index of the dataframe
    for maj_category in copy_df.index:
        # Select rows in minor df where category is the same as major df category
        minor_rows = min_df[min_df.category == maj_category]
        minor_rows = minor_rows.drop("category", axis=1)
        # Compute the mean values (by column) of the rows that were selected
        # Add the mean values into copy_df, where the index corresponds to major df category
        copy_df.loc[maj_category] = minor_rows.mean()

    # Store into dict
    copy_dfs[k] = copy_df

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

【问题讨论】:

    标签: python pandas dataframe loops vectorization


    【解决方案1】:

    这个?

    import pandas as pd
    
    df = pd.read_excel('test.xlsx')
    df1 = df.groupby(['category']).mean()
    print(df)
    print(df1)
    

    输出:

        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
    

    【讨论】:

    • 哇,这正是我要找的!不知道有这个groupby 命令。非常感谢
    猜你喜欢
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多