У меня есть много данных, например:
df1 df2 and so on...
gene | counts gene | counts
KRAS 136 KRAS 96
DNAH5 3 DNAH5 4
TP53 105 TP53 20
Я хочу объединить их и суммировать значения столбцов, чтобы в итоге остался только один фрейм данных.
merged_df
gene | counts
KRAS 232
DNAH5 7
TP53 125
Я пытался использовать pd.merge, но он принимает только 2 фрейма данных одновременно, у меня 14 фреймов данных. Я использовал pd.concat для нескольких фреймов данных, но не могу их суммировать после этого.
Вы можете попробовать это:
dataframes = [df1, df2, df3] # Add your dataframes here
concatenated_df = pd.concat(dataframes)
result_df = concatenated_df .groupby('gene', as_index=False).sum()
Вероятно, в конце вы захотите использовать функцию df.groupby()
.
Вот как это сделать:
Сначала вы df = df.concat([df1, df2, df3...])
используете свои фреймы данных, так что в итоге у вас получится один большой фрейм данных.
После этого вам нужно использовать df = df.group_by('gene').sum().reset_index()
По сути, вы группируете все строки на основе уникального столбца «ген», а затем суммируете все значения «счетчиков» для каждого «гена».
Индекс сброса просто преобразует сгруппированные значения «гена» обратно в обычный столбец.
Вы можете попробовать запустить каждую команду одну за другой, чтобы понять, что происходит.
Действительно, pd.merge
объединяет только два кадра данных. Но pd.join
могут присоединиться ко многим, если у них одинаковый индекс:
# Some example data. Note the None in `df3`. We want our code to handle that well.
df1 = pd.DataFrame({'gene': ['KRAS', 'DNAH5', 'TP53'], 'counts': [136, 3, 105]})
df2 = pd.DataFrame({'gene': ['KRAS', 'DNAH5', 'TP53'], 'counts': [96, 4, 20]})
df3 = pd.DataFrame({'gene': ['KRAS', 'DNAH5', 'TP53'], 'counts': [1000, None, 3000]})
dfs = [df1, df2, df3]
# We need the same index for the pd.DataFrame.join to work
dfs = [df.set_index('gene') for df in dfs]
# All the non-index columns need unique names, so chanding `columns` to `columns_0`, `columns_1`
dfs = [df.rename(columns = {'counts': f'counts_{i}'}) for i, df in enumerate(dfs)]
# Actual join. We are joining first with the rest
df = dfs[0].join(dfs[1:], how='outer')
# Since we don't have any other data, we can just sum all columns.
df.sum(1)
Это печатает:
gene
KRAS 1232.0
DNAH5 7.0
TP53 3125.0
Избегайте необходимости df.groupby (как здесь ) или переименования столбцов (как здесь):
df
axis=1
axis=1
и df.reset_indeximport pandas as pd
df1 = pd.DataFrame({'gene': ['KRAS', 'DNAH5', 'TP53'], 'counts': [136, 3, 105]})
df2 = pd.DataFrame({'gene': ['KRAS', 'DNAH5', 'TP53'], 'counts': [96, 4, 20]})
dfs = [df1, df2]
out = (
pd.concat([df.set_index('gene') for df in dfs], axis=1)
.sum(axis=1)
.reset_index(name='counts')
)
Выход:
gene counts
0 KRAS 232
1 DNAH5 7
2 TP53 125
это сработало, спасибо!!