Как соединить две строки с одинаковыми ключами и дополнительными значениями - PullRequest
1 голос
/ 16 января 2020

Моя цель - свернуть таблицу ниже в один столбец, и этот вопрос конкретно касается синей строки ниже. Таблица содержит три категориальные переменные и 6 аналитических / количественных переменных. Столбцы C1 и C2 - единственные переменные, которые должны совпадать для успешного объединения. Все пустые ячейки являются NaN, а python код для копирования приведен ниже. Эти строки экспортируются независимо, поскольку они содержат информацию, найденную в других связанных таблицах, не включенных в экспорт.

Вопрос . (Синий) Некоторая количественная информация в синем ряду также находится в сером ряду, а некоторые - нет. Есть ли способ скопировать новую информацию (-8 в Q6) в серый ряд, а затем удалить / выделить синий ряд? Здесь сохраняется категориальная информация серой строки, если предположить, что keep_ 'first' по умолчанию drop_duplicates активен.

Смежный вопрос . (Желтая строка) Как удалить строки, которые не являются точными дубликатами, но не содержат никакой новой информации (больше NaN)

Таблица данных

Table for data analysis

Ожидаемый результат

Ожидаемый результат будет иметь серую строку, обновленную с Q6 из синей строки и синей строки удалены.

[['C1 (PK)', 'C2 (FK)', 'C3', 'C4', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5', 'Q6']
['S1','P3','H1',Timestamp('2004-12-04 00:00:00'),-15.0,-27.4,nan,-10.0,-15.0,-8]]

Текущий прогресс

Мой текущий код включает эту строку для удаления всех строк, где все количественные переменные имеют значение NaN. df.dropna(subset=df.columns[4:],how='all', inplace=True)

Также эта строка для удаления всех строк, где все количественные переменные одинаковы. df.drop_duplicates(subset=df.columns[4:], inplace=True)

Пример кода, который можно скопировать в IDE.

import pandas as pd

df = [['S1','P3','H1',Timestamp('2004-12-04 00:00:00'),-15.0,-27.4,nan,-10.0,-15.0,nan],
 ['S1','P3','H1',Timestamp('2004-12-20 00:00:00'),nan,nan,nan,nan,nan,nan],
 ['S1','P3','H2',Timestamp('2004-12-20 00:00:00'),-15.0,nan,nan,-10.0,nan,nan],
 ['S1','P3','H3',Timestamp('2004-12-07 00:00:00'),nan,nan,nan,nan,-15.0,-8.0],
 ['S1','P3','H1', Timestamp('2004-12-04 00:00:00'), -15.0,-27.4,nan,-10.0, -15.0, nan]]
cols = ['C1 (PK)', 'C2 (FK)', 'C3', 'C4', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5', 'Q6']
pd.DataFrame(data=df,columns=cols)

df.drop_duplicates(inplace=True)
df.dropna(subset=df.columns[4:],how='all', inplace=True)
df.drop_duplicates(subset=df.columns[4:], inplace=True)

1 Ответ

0 голосов
/ 16 января 2020

Разделение категориальных столбцов:

df_categorical = df[['C1 (PK)', 'C2 (FK)',"C3", "C4"]]

Выполните группирование по первым двум столбцам и выберите первый элемент для сохранения:

df_categorical = df_categorical.groupby(["C1 (PK)", "C2 (FK)"]).first()

Для количественных столбцов снова используйте groupby и используйте означает это время:

df_quantitative = df.groupby(['C1 (PK)', 'C2 (FK)']).mean()

объединить два кадра данных, чтобы получить результат

df_final = pd.concat([df_quantitative, df_categorical], axis=1)

сбросить индекс

df_final.reset_index(inplace=True)
...