Группировать по столбцам при объединении фреймов данных - PullRequest
0 голосов
/ 29 апреля 2019

Я объединяю несколько фреймов данных в один фрейм данных в цикле for.примерно так:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(data=np.random.randint(0,100,(2,5)),columns=list('ABCDE'))
df2 = pd.DataFrame(data=np.random.randint(0,100,(2,5)),columns=list('GHABC'))
df1 = df1.merge(df2, how='outer', left_index=True, right_index=True,suffixes=('', '_' + 'second'))

Несколько столбцов в каждом из этих фреймов данных имеют похожие имена, поэтому каждый раз, когда появляется такой столбец, я добавляю суффикс.Это становится беспорядком.Кроме того, я хотел бы иметь возможность быстрого доступа ко всем столбцам из первой таблицы, второй и т. Д. Есть ли способ объединить эти столбцы, но сохранить их как группу?Так что мне не нужно менять имя столбца, и я могу получить доступ ко всем столбцам каждого набора данных?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Вот способ горизонтального слияния фреймов данных с помощью MultiIndex , который имеет некоторые преимущества по сравнению с вертикальным слиянием. Например, у вас не будет много полей NaN, а dtype не изменится с int на float, как в случае с горизонтальным слиянием.

import numpy as np
import pandas as pd


df1 = pd.DataFrame(data=np.random.randint(0, 100, (2, 5)),
                   columns=list('ABCDE'))
df2 = pd.DataFrame(data=np.random.randint(0, 100, (2, 5)),
                   columns=list('GHABC'))
dfs = [df1, df2]
result = pd.concat(dfs, axis=1, keys=range(len(dfs)))
print(result)

Это даст:

    0                   1                
    A   B   C   D   E   G   H   A   B   C
0  41  49  13  36  57  28  12  82  18  67
1  72  91  34  17  12   6  67  98  36  25

Вы можете получить доступ к каждой группе в цикле:

for source_index, df in result.groupby(axis=1, level=0):
    print(df)
    0                
    A   B   C   D   E
0  41  49  13  36  57
1  72  91  34  17  12
    1                
    G   H   A   B   C
0  28  12  82  18  67
1   6  67  98  36  25

или индивидуально:

gb = result.groupby(axis=1, level=0)
first_group = gb.get_group(0)
print(first_group)
    0                
    A   B   C   D   E
0  41  49  13  36  57
1  72  91  34  17  12

Рекомендации:

0 голосов
/ 29 апреля 2019

Вот иллюстрация того, что @QuangHoang предложил в их комментарии :

import pandas as pd


df1 = pd.DataFrame(data=np.random.randint(0, 100, (2, 5)),
                   columns=list('ABCDE'))
df2 = pd.DataFrame(data=np.random.randint(0, 100, (2, 5)),
                   columns=list('GHABC'))
dfs = [df1, df2]
for source_index, df in enumerate(dfs):
    df['data_source'] = source_index
result = pd.concat(dfs)
print(result)

даст всем вашим фреймам данных, соединенным вертикально:

    A   B   C     D     E     G     H  data_source
0  66  52  16  73.0  59.0   NaN   NaN            0
1  73  64  59  31.0  13.0   NaN   NaN            0
0  72  79  45   NaN   NaN  30.0   0.0            1
1  45  52  40   NaN   NaN   2.0  80.0            1

Для доступакаждую группу в цикле вы можете сделать:

for source_index, df in result.groupby('data_source'):
    print(df.dropna(axis=1))
    A   B   C     D     E  data_source
0  66  52  16  73.0  59.0            0
1  73  64  59  31.0  13.0            0
    A   B   C     G     H  data_source
0  72  79  45  30.0   0.0            1
1  45  52  40   2.0  80.0            1

или по индексу источника:

gb = result.groupby('data_source')
source_index = 0
first_group = gb.get_group(source_index).dropna(axis=1)
print(first_group)
    A   B   C     D     E  data_source
0  66  52  16  73.0  59.0            0
1  73  64  59  31.0  13.0            0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...