Объединить список DataFrame в столбце?

у меня возникли проблемы с объединением массива фреймов данных в один фрейм данных, объединенный в определенном столбце.

у меня есть список фреймов данных под названием data, причем каждый элемент data[i] выглядит так:

     Rank  Name
2400    1 name1
2401    2 name2
2402    3 name3
2403    4 name4
2404    5 name5

каждый DataFrame содержит список Топ-5 для данного месяца, и список содержит ежемесячные результаты за год.

Я хотел бы, чтобы окончательный, объединенный фрейм данных выглядел так:

     Rank  Name_month1 Name_month2 Name_month3 ...
2400    1        name1       name1       name1 ...
2401    2        name2       name2       name2 ...
2402    3        name3       name3       name3 ...
2403    4        name4       name4       name4 ...
2404    5        name5       name5       name5 ...

где каждый столбец, после во-первых, соответствует месячному рангу.

у меня нет проблем с объединением 2 кадров данных из списка,data:

pandas.merge(data[0], data[1], on='Rank', suffix=['_month1', '_month2'])

но когда я пытаюсь использовать filter() или цепи .merges, Я продолжаю сталкиваться с проблемами.

какие мысли? Спасибо!

2 ответов


проблема в том, что при первом слиянии вы изменили имена столбцов (добавив суффиксы), и во втором слиянии не будет столкновения имен, поэтому суффиксы во втором слиянии никогда не будут использоваться. Решение переименовать столбцы вручную после слияния.

In [2]: df
Out[2]:       Rank   Name
        2400     1  name1
        2401     2  name2
        2402     3  name3
        2403     4  name4
        2404     5  name5
In [3]: df.merge(
            df, on='Rank', suffixes=['_month1', '_month2']
        ).merge(df, on='Rank').rename(
            columns={'Name': 'Name_month3'}
        ).merge(df, on='Rank').rename(
            columns={'Name': 'Name_month4'}
        )
Out[3]:    Rank Name_month1 Name_month2 Name_month3 Name_month4
        0     1       name1       name1       name1       name1
        1     2       name2       name2       name2       name2
        2     3       name3       name3       name3       name3
        3     4       name4       name4       name4       name4
        4     5       name5       name5       name5       name5

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

In [4]: data = [df, df, df, df]
        current = data[0].rename(columns={'Name': 'Name_month1'})
        for i, frame in enumerate(data[1:], 2):
            current = current.merge(frame, on='Rank').rename(
                         columns={'Name': 'Name_month%d' % i})
        current
Out[4]:    Rank Name_month1 Name_month2 Name_month3 Name_month4
        0     1       name1       name1       name1       name1
        1     2       name2       name2       name2       name2
        2     3       name3       name3       name3       name3
        3     4       name4       name4       name4       name4
        4     5       name5       name5       name5       name5

Я создал Gist, содержащий функцию для присоединения к "списку" фреймов данных. Список на самом деле является словарем, содержащим ключи, которые являются суффиксами, используемыми в случае столкновения имен столбцов:

Присоединяйтесь к списку (dict) фреймов данных pandas

https://gist.github.com/mpschr/5db20df78c034654f030