конкатенации панд с повторяющимися индексами - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть два Dataframes, которые я хочу объединить горизонтально, сгруппировав их по значению столбца. С сайта pandas.pydata они делают:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                   index=[2, 3, 6, 7])

df1 = 
    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3

df4 = 
    B   D   F
2  B2  D2  F2
3  B3  D3  F3
6  B6  D6  F6
7  B7  D7  F7

result = pd.concat([df1, df4], axis=1, join='inner')

result = 
    A   B   C   D   B   D   F
2  A2  B2  C2  D2  B2  D2  F2
3  A3  B3  C3  D3  B3  D3  F3

Это работает, и я рад этому. Поэтому я использую этот трюк для слияния двух фреймов данных по значению определенного столбца, в основном я переиндексирую фрейм данных с этим столбцом, а затем делаю конкатенацию. Однако значения в этом столбце повторяются, поэтому я заканчиваю кадры данных с повторяющимися индексами:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 3, 3, 2])
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                   index=[2, 3, 6, 7])
df1 = 
    A   B   C   D
0  A0  B0  C0  D0
3  A1  B1  C1  D1
3  A2  B2  C2  D2
2  A3  B3  C3  D3

df4 = 
    B   D   F
2  B2  D2  F2
3  B3  D3  F3
6  B6  D6  F6
7  B7  D7  F7

Итак, я ожидаю, что эти два кадра данных объединятся, поэтому я получу:

result = 
    A   B   C   D   B   D   F
3  A1  B1  C1  D1  B2  D2  F2
3  A2  B2  C2  D2  B2  D2  F2
2  A3  B3  C3  D3  B3  D3  F3

(Обратите внимание, что две строки с индексом 3 в df1 обе соединяются со строкой с индексом 3 в df4) Однако это не работает.

ValueError: Shape of passed values is (7, 5), indices imply (7, 3)

Как мне этого достичь? f Я могу избежать слияния по индексу, но я могу указать столбец, это было бы еще лучше

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Другое возможное решение - использовать join:

df1.join(df4,how='inner', lsuffix='_df1', rsuffix='_df4')

Выход:

    A B_df1   C D_df1 B_df4 D_df4   F
2  A3    B3  C3    D3    B2    D2  F2
3  A1    B1  C1    D1    B3    D3  F3
3  A2    B2  C2    D2    B3    D3  F3
0 голосов
/ 19 ноября 2018

Одно возможное решение с merge с сопоставлением по индексу, по умолчанию how='inner' должно быть опущено:

result = pd.merge(df1, df4, left_index=True, right_index=True)
print (result)
    A B_x   C D_x B_y D_y   F
2  A3  B3  C3  D3  B2  D2  F2
3  A1  B1  C1  D1  B3  D3  F3
3  A2  B2  C2  D2  B3  D3  F3

Создает комбинацию дублированных совпавших строк:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 3, 3, 3])
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                   index=[2, 3, 3, 7])
print (df1)
    A   B   C   D
0  A0  B0  C0  D0
3  A1  B1  C1  D1
3  A2  B2  C2  D2
3  A3  B3  C3  D3

print (df4)
    B   D   F
2  B2  D2  F2
3  B3  D3  F3
3  B6  D6  F6
7  B7  D7  F7

result = pd.merge(df1, df4, left_index=True, right_index=True)
print (result)
    A B_x   C D_x B_y D_y   F
3  A1  B1  C1  D1  B3  D3  F3
3  A1  B1  C1  D1  B6  D6  F6
3  A2  B2  C2  D2  B3  D3  F3
3  A2  B2  C2  D2  B6  D6  F6
3  A3  B3  C3  D3  B3  D3  F3
3  A3  B3  C3  D3  B6  D6  F6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...