Как объединить несколько фреймов данных и суммировать общие значения в столбец

У меня есть много данных, например:

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 для нескольких фреймов данных, но не могу их суммировать после этого.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
70
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете попробовать это:

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

это сработало, спасибо!!

Camila 18.07.2024 16:53

Избегайте необходимости df.groupby (как здесь ) или переименования столбцов (как здесь):

  • Используйте понимание списка, чтобы применить df.set_index к каждому df
  • Передайте список pd.concat с помощью axis=1
  • Примените df.sum на axis=1 и df.reset_index
import 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

Другие вопросы по теме

Как сопоставить прогнозы за несколько временных интервалов с фактическими значениями?
Суммирование перестановок в фрейме данных Pandas растет суперэкспоненциально
Найдите значение в столбце, который содержит список, возьмите другое значение из следующего столбца и поместите его в первую таблицу в новый столбец
Python pandas read_sas с параметром размера фрагмента завершается с ошибкой из-за несоответствия индекса
Как я могу заполнить значение на основе другого категориального столбца
Что означает: приведение данных Pandas к numpy dtype объекта. Проверьте входные данные с помощью np.asarray(data) и как это можно решить?
Как обобщить фрейм данных в пандах на основе значений
Отсутствует модуль Sklearn и вы не знаете, что использовать вместо него?
Как я могу эффективно фильтровать и агрегировать данные в Pandas DataFrame с несколькими условиями?
Существует ли идиома Pandas для чтения файла CSV с категориальными данными, имеющими варианты написания?