Панды сливаются в первом столбце - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь объединить два кадра данных панд, которые имеют повторяющиеся строки (здесь строки, состоящие из 2, соответствующих 'a' и 'b'), среди записей, которые я пытаюсь объединить.В результате pandas берет декартово произведение повторяющихся строк, как показано ниже:

In [8]: df1 = pd.DataFrame({'a' : [1, 2, 2], 'b' : [2, 2, 2], 'c' : [3, 6, 6]}) 

In [9]: df2 = pd.DataFrame({'a' : [2, 2], 'b' : [2, 2], 'd' : [2, 5]})          

In [10]: df1.merge(df2, how='outer', on=['a', 'b'])                             
Out[10]: 
   a  b  c    d
0  1  2  3  NaN
1  2  2  6  2.0
2  2  2  6  5.0
3  2  2  6  2.0
4  2  2  6  5.0

В результате я хочу, чтобы слияние выполнялось только один раз между каждой повторяющейся строкой, в порядке их появления(в данном случае численно по индексу).Итак, вывод, который я хотел бы получить:

In [12]: df_output = pd.DataFrame({'a' : [1, 2, 2], 'b' : [2, 2, 2], 'c' : [3, 6
    ...: , 6], 'd' : [np.nan, 2, 5]})                                           

In [13]: df_output                                                              
Out[13]: 
   a  b  c    d
0  1  2  3  NaN
1  2  2  6  2.0
2  2  2  6  5.0

Как бы я это сделал?

Ответы [ 3 ]

0 голосов
/ 11 марта 2019

Не drop_duplicates не решает вашу проблему?

df = df1.merge(df2, how='outer', on=['a', 'b'])
df = df.drop_duplicates()
0 голосов
/ 11 марта 2019

Я думаю, этого будет достаточно

df1.merge(df2, how = 'outer').drop_duplicates()
0 голосов
/ 11 марта 2019

Вам нужен вспомогательный столбец с помощью счетчика, созданного GroupBy.cumcount:

df1 = pd.DataFrame({'a' : [1, 2, 2], 'b' : [2, 2, 2], 'c' : [3, 6, 6]}) 
df2 = pd.DataFrame({'a' : [2, 2], 'b' : [2, 2], 'd' : [2, 5]})    

df1['g'] = df1.groupby(['a', 'b']).cumcount()
df2['g'] = df2.groupby(['a', 'b']).cumcount()

df = df1.merge(df2, how='outer', on=['a', 'b', 'g'])  
print (df)
   a  b  c  g    d
0  1  2  3  0  NaN
1  2  2  6  0  2.0
2  2  2  6  1  5.0

Последнее удаление g столбец:

df = df1.merge(df2, how='outer', on=['a', 'b', 'g']).drop('g', axis=1)  
print (df)
   a  b  c    d
0  1  2  3  NaN
1  2  2  6  2.0
2  2  2  6  5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...