Мой фрейм данных находится в связанном изображении. По сути, для простоты мой фрейм данных в настоящее время выглядит примерно так:
Всего имеется 3105 столбцов Cell_A и Cell_B вместе взятых. Существует около 13 тысяч (я думаю?) рядов генов. Я хочу получить среднее число на ген (строку), сгруппированное по уникальному имени столбца. Таким образом, в итоге у меня будет всего два столбца, Cell_A и Cell_B, со средним числом (на ген, т. е. строка) в качестве данных.
Я ожидаю, что это должно что-то сделать либо с agg, либо с groupby. Но я даже понятия не имею, с чего начать. Если подскажете, буду очень признателен!
Вы правы, вы хотите сгруппировать по столбцам и выполнить операцию mean
.
Сначала сохраните первый столбец как индекс:
df = df.set_index(['Gene'])
Тогда делай
df.groupby(by=df.columns, axis=1).mean()
Огромное спасибо, получилось именно то, что я хотел! Тимус прав, ось = 1 устарела, я получил предупреждающее сообщение об этом, но функция все еще работала
О, хорошо знать об амортизации.
Вы правы, groupby()
здесь уместен. У меня есть такая схема, думаю, она вам подойдет:
В коде это выглядит примерно так:
# Melting the DataFrame into long format
df_melted = pd.melt(df, id_vars=['Gene'], var_name='Cell_Type', value_name='Value')
# Standardizing cell types (e.g., "Cell_B1" and "Cell_B2" to just "Cell_B")
df_melted['Cell_Type'] = df_melted['Cell_Type'].str.replace(r'\d+', '')
# Grouping by Gene and Cell_Type and calculating the mean
df_grouped = df_melted.groupby(['Gene', 'Cell_Type']).mean().reset_index()
# Pivoting back to wide format
df_pivot = df_grouped.pivot(index='Gene', columns='Cell_Type', values='Value').reset_index()
Спасибо за ваш ответ! Я немного подправил этот код, и он сработал именно так, как я и надеялся.
Вам больше не следует использовать опцию
axis=1
для.groupby
, она устарела. Вместо этого:df.set_index("Gene").T.groupby(level=0).mean().T
.