#python #pandas #dataframe #loops #vectorization
#питон #панды #фрейм данных #петли #векторизация
Вопрос:
Я пытаюсь объединить три фрейма данных панд вместе
Один из них (называемый 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
категорией`, где каждая строка имеет значение, присутствующее в столбце основная категория 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 есть столбцы 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 и индексами из разных значений категорий. Затем я заполняю этот фрейм данных, используя цикл 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
Тем не менее, я думаю, что этот код можно было бы оптимизировать с помощью векторизованных операций, особенно в той части, где я повторяю для каждой строки. Поэтому мне было интересно, есть ли более простой и умный способ выполнить то, что я пытаюсь сделать ?
Ответ №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
Комментарии:
1. Вау, это именно то, что я ищу ! Не знал, что есть такая
groupby
команда. Большое спасибо