#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