объедините два фрейма данных pandas без дублирования элементов

#python #pandas #dataframe #merge

#питон #панды #фрейм данных #поглощать

Вопрос:

У меня есть два кадра данных

 left = pd.DataFrame(  {"K": ["K0", "K0", "K1", "K2"], "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"]} )  right = pd.DataFrame(  {"K": ["K0", "K0", "K0", "K2"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"]} )   K A B 0 K0 A0 B0 1 K0 A1 B1 2 K1 A2 B2 3 K2 A3 B3   K C D 0 K0 C0 D0 1 K0 C1 D1 2 K0 C2 D2 3 K2 C3 D3  

Я хочу объединить их в один фрейм данных, чтобы учитывались только строки, в которых ключ присутствует в обоих фреймах данных:

 K A B C D 0 K0 A0 B0 C0 D0 1 K0 A1 B1 C1 D1 2 K2 A2 B2 C3 D3  

Если я использую pandas.merge, я всегда получаю повторяющиеся строки. Есть ли простой способ достичь этого?

Комментарии:

1. У вас есть дубликаты ключей. На чем вы пытаетесь слиться?

Ответ №1:

Перечислите ключи, затем объедините как ключ, так и перечисление:

 (left.assign(enum=left.groupby('K').cumcount())  .merge(right.assign(enum=right.groupby('K').cumcount()),  on=['K', 'enum'])  .drop('enum', axis=1) )  

Выход:

 K A B C D 0 K0 A0 B0 C0 D0 1 K0 A1 B1 C1 D1 2 K2 A3 B3 C3 D3  

Ответ №2:

используйте pd.concat

 data1="""Index K A B 0 K0 A0 B0 1 K0 A1 B1 2 K1 A2 B2 3 K2 A3 B3"""  data2="""K C D 0 K0 C0 D0 1 K0 C1 D1 2 K0 C2 D2 3 K2 C3 D3"""  data1 = pd.read_table(StringIO(data1), sep='s ') data1 = data1.rename(columns={'K':'K1'})  data2 = pd.read_table(StringIO(data2), sep='s ') data2 = data2.rename(columns={'K':'K2'}) data = pd.concat([data1, data2], axis=1)   #print(data1,data2) data = data.drop(data[data.K1 != data.K2].index, axis=0) data.drop('K2',axis=1,inplace=True) print(data)  

выход

 Index K1 A B C D 0 0 K0 A0 B0 C0 D0 1 1 K0 A1 B1 C1 D1 3 3 K2 A3 B3 C3 D3