выполнение слияния при сохранении всех остальных данных и сохранении порядка оригинала - PullRequest
1 голос
/ 11 марта 2019

Допустим, у меня есть фрейм данных, который выглядит следующим образом:

idx  city           pop
A1   New York City  600
A2   Los Angeles    500
B1   Chicago        300
B2   Miami          200

и другой фрейм данных, который выглядит следующим образом

idx  city           pop
A1   (-1.05, 3.45)  6.5
A2   (-1.15, 3.55)  6.3
B1   (-1.25, 3.65)  5.7
B2   (-1.35, 3.75)  4.8

Я хотел бы выполнить операцию слияния для достиженияследующее:

idx  city_x         city_y         pop_x  pop_y
A1   New York City  (-1.05, 3.45)  600    6.5
A2   Los Angeles    (-1.15, 3.55)  500    6.3
B1   Chicago        (-1.25, 3.65)  300    5.7
B2   Miami          (-1.35, 3.75)  200    4.8

Обратите внимание, что для меня важно сохранить эту структуру столбца данных ... Я хотел бы, чтобы она сливалась, как она принадлежит в x, y, x, y, x, yформат

Слияние, которое я выполняю в настоящее время (с другими данными - не с этими фиктивными данными):

result = pd.merge(df1, df2, left_on='idx', right_on='idx', how='left', suffixes=('_x', '_y'))

, но в результате получается фрейм данных, имеющий _x с одной стороны и y_ с другой, что затрудняет мне проверку на +, убедитесь в точности.

Правильно ли выполняется слияние?

1 Ответ

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

Для этого требуется лишь простая логика сортировки:

v = df1.merge(df2, on='idx')
result = v[sorted(v.columns, key=lambda x: df1.columns.get_loc(x.split('_')[0]))]
result

  idx         city_x         city_y  pop_x  pop_y
0  A1  New York City  (-1.05, 3.45)    600    6.5
1  A2    Los Angeles  (-1.15, 3.55)    500    6.3
2  B1        Chicago  (-1.25, 3.65)    300    5.7
3  B2          Miami  (-1.35, 3.75)    200    4.8

Это приводит к переупорядочению столбцов результата на основе позиции имени столбца с меньшим суффиксом в исходных кадрах данных.


Еслиимена столбцов разные, используйте

def sorter(x):
    df = df1 if x in df1.columns else df2
    return df.columns.get_loc(x.split('_')[0])

v = df1.merge(df2, ...)
result = v[sorted(v.columns, key=sorter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...