Как объединить только не избыточные строки в кадре данных, основываясь на определенных c функциях? - PullRequest
0 голосов
/ 16 января 2020

У меня очень сложная проблема, и мне нужно выполнить объединение 1 и 2. Вывод должен выглядеть следующим образом: Out.

1:
A B C | Y
1 1 5   1 <---- keep
2 2 5   1 <---- keep

2:
A B C | Y
1 1 6   0 <---- drop, because duplicated on subset=[A,B] with row of table 1.
1 2 6   0 <---- keep
3 3 6   0 <---- keep, despite duplicated on subset=[A,B] within this table.
3 3 7   0 <---- keep, despite duplicated on subset=[A,B] within this table.

Out:
A B C | Y
1 1 5   1
1 2 6   0
2 2 5   1
3 3 6   0
3 3 7   0

Итак, как вы видите, я не могу просто отбросить дубликаты на основе subset=[A,B] после объединения. Это также приведет к удалению строк 3 3 6 0 и 3 3 7 0.

Подводя итог: я просто хочу объединить 1 и 2. И если в таблице 2 есть строка с теми же значениями A и B, что и в таблице 1, я хотел бы сохранить только строки Таблица 1. Я не хочу отбрасывать другие дубликаты на основе A и B в таблице 2.

С уважением

Ответы [ 2 ]

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

У меня есть решение, подобное Sandipan, вместо этого я использую внутреннее соединение, чтобы сделать это.

import pandas as pd
df1 = pd.DataFrame([[1, 1, 5, 1], [2, 2, 5, 1]], columns = ['A','B','C', 'Y'])
df2 = pd.DataFrame([[1, 1, 6, 0], [1, 2, 6, 0], [3, 3, 6, 0], [3, 3, 7, 0]], columns = ['A','B','C', 'Y'])

# Add an index for df2
df2['idx'] = range(len(df2))

# Find the index of common rows by inner join
common_row = pd.merge(df1, df2, on=['A','B'], how='inner').idx.tolist()

# Remove common rows in df2
df2 = df2[~df2.idx.isin(common_row)]
df2 = df2.iloc[:,0:-1]

# Concat df1 and df2
df = pd.concat([df1, df2])
df = df.sort_values(by=['A','B'], ascending=[True, True])
df
0 голосов
/ 16 января 2020

Я думаю, что-то вроде следующего с использованием full outer join должно работать (вы можете записать строки в выходной таблице, если необходимо):

import pandas как pd import numpy как np

df1 = pd.DataFrame([[1, 1, 5, 1], [2, 2, 5, 1]], columns = ['A','B','C', 'Y'])
df2 = pd.DataFrame([[1, 1, 6, 0], [1, 2, 6, 0], [3, 3, 6, 0], [3, 3, 7, 0]], columns = ['A','B','C', 'Y'])
df = pd.merge(df1, df2, on=['A','B'], how='outer')
df['C'] = df.apply(lambda row: row.C_x if not np.isnan(row.C_x) else row.C_y, axis=1).astype(int)
df['Y'] = df.apply(lambda row: row.Y_x if not np.isnan(row.C_x) else row.Y_y, axis=1).astype(int)
df = df[['A','B','C','Y']]
df.head()

#   A  B  C  Y
#0  1  1  5  1
#1  2  2  5  1
#2  1  2  6  0
#3  3  3  6  0
#4  3  3  7  0
...