计算 Pandas 中具有相同列值的行的平均值
Compute mean value of rows that has the same column value in 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"])
A B category
0 90 17 cat_A
1 36 81 cat_B
2 90 67 cat_C
另外两个 df(称为 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)
这是其中一个次要 df 的示例。两者之间的唯一区别是第一个次要 df 有 C
和 D
列,而第二个有 E
和 F
.
列
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
但是,我认为可以使用矢量化操作优化此代码,尤其是在我为每一行迭代的部分。所以我想知道是否有更简单、更聪明的方法来完成我想做的事情?
这个?
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
我正在尝试将三个 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
另外两个 df(称为 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)
这是其中一个次要 df 的示例。两者之间的唯一区别是第一个次要 df 有 C
和 D
列,而第二个有 E
和 F
.
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
但是,我认为可以使用矢量化操作优化此代码,尤其是在我为每一行迭代的部分。所以我想知道是否有更简单、更聪明的方法来完成我想做的事情?
这个?
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