Разделить столбец на несколько групп по группам с помощью панд - PullRequest
2 голосов
/ 10 июля 2019

Я только начал использовать Python, и у меня возникла проблема, связанная с набором данных, с которым я работаю.

У меня есть следующий набор данных:

    C1  C2  C3          C4      C5      C6
    99  069 99002068    3348117 3230802 T6
    99  069 99002063    4599974 178885  T4
    99  069 99002063    4599974 4606066 T4
    99  069 99002063    4599974 236346  T4
    99  069 99002063    4599974 310114  T4

Iнеобходимо сгруппировать по транспонированному столбцу C5 несколько столбцов на основе группировки по столбцам C1, C2, C3, C4, C6.

Код, который я написал до сих пор, следующий:

    # load plugins
    import pandas as pd

    # import CSV
    data = pd.read_csv(
        "C:/Users/mcatuogno/Desktop/lista_collegamenti_onb.csv",
        sep=";",
        header=None,
        dtype=str,
        usecols=[0, 1, 2, 3, 4, 5],
        names=["C1", "C2", "C3", "C4", "C5", "C6"]
    )

    # sort values
    dataSort = data.sort_values(["C1", "C2", "C3", "C4"])

    # transpose column based on group by function
    dataTranspose = dataSort.groupby(["C1", "C2", "C3", "C4", "C6"])["C5"].apply(list)

С кодом выше результат будет

    C1   C2  ...              C6      C5
    99  000  ...  09900000001100      [102995, 102997, 102996]
    99  000  ...  09900000001135      [103042]

Я не знаю, как я могу разбить столбец C5 на несколько столбцов, каждый со следующим именем CN_1, CN_2, ..., CN_x.

Какую функцию Python я могу использовать?

Заранее спасибо!

1 Ответ

3 голосов
/ 10 июля 2019

Вы можете создать вспомогательную серию для подсчета последовательных значений по группам на GroupBy.cumcount, добавить к MultiIndex и изменить на Series.unstack:

g = dataSort.groupby(["C1", "C2", "C3", "C4", "C6"])["C5"].cumcount()
print (g)
1    0
2    1
3    2
4    3
0    0
dtype: int64

df = (dataSort.set_index(["C1", "C2", "C3", "C4", "C6", g])['C5']
              .unstack()
              .add_prefix('Cn_')
              .reset_index())
print (df)
   C1  C2        C3       C4  C6       Cn_0       Cn_1      Cn_2      Cn_3
0  99  69  99002063  4599974  T4   178885.0  4606066.0  236346.0  310114.0
1  99  69  99002068  3348117  T6  3230802.0        NaN       NaN       NaN

Ваше решение должно быть изменено для создания нового DataFrame для каждого конструктора:

dataTranspose = dataSort.groupby(["C1", "C2", "C3", "C4", "C6"])["C5"].apply(list)

df = (pd.DataFrame(dataTranspose.values.tolist(), index = dataTranspose.index)
        .add_prefix('Cn_')
        .reset_index())
print (df)
   C1  C2        C3       C4  C6     Cn_0       Cn_1      Cn_2      Cn_3
0  99  69  99002063  4599974  T4   178885  4606066.0  236346.0  310114.0
1  99  69  99002068  3348117  T6  3230802        NaN       NaN       NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...