Разделение элементов списка на отдельные столбцы - pandas data-frame - PullRequest
0 голосов
/ 03 октября 2019

У меня есть начальный фрейм данных pandas, который выглядит следующим образом - каждая ячейка представляет собой список значений начальный ввод

Python-скрипт - чтобы получить начальный фрейм данных - как упомянуто Ианом Томпсономв этом ответе -

import pandas as pd

df_out1 = pd.DataFrame({
    0: [
        [None, 'A', 'B', 'C', 'D'],
        [None, 'A1', 'B1', 'C1', 'D1'],
        [None, 'A2', 'B2', 'C2', 'D2'],
    ],
    1: [
        [None] * 5,
        [None] * 5,
        [None] * 5,
    ],
    2: [
        ['V', 'W', 'X', 'Y', 'Z'],
        ['V1', 'W1', 'X1', 'Y1', 'Z1'],
        ['V2', 'W2', 'X2', 'Y2', 'Z2'],
    ]
})

Я хочу отформатировать его следующим образом - для каждой строки - каждый элемент списка образует столбец и сделать это для всех повторений / итераций - желаемый вывод

Мой исходный набор входных данных огромен - 10000 строк и 40 столбцов. Я выполняю приведенный ниже скрипт на Python - хотя он работает и обеспечивает желаемый результат - когда я запускаю его для 2000 строк и 40 столбцов - время выполнения близко к 1800 секундам, которые, я думаю, находятся на более высокой стороне.

Python-скрипт: df_out1 - начальный фрейм данных

d = pd.DataFrame()
for x in range(len(df_out1)):
    for y in range(len(df_out1.columns)):
        d = d.append(pd.Series(df_out1[y][x]), ignore_index=True)
d.to_csv('inter_alm_output_' + str(time.strftime("%Y%m%d-%H%M%S")) + '.csv')

Есть ли способ добиться этого за меньшее время, другими словами, оптимизировать его?

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Если это ваш начальный кадр данных:

df = pd.DataFrame({
    0 : [
        [None, 'A', 'B', 'C', 'D'],
        [None, 'A1', 'B1', 'C1', 'D1'],
        [None, 'A2', 'B2', 'C2', 'D2'],
    ],
    1 : [
        [None]*5,
        [None]*5,
        [None]*5,
    ],
    2 : [
        ['V', 'W', 'X', 'Y', 'Z'],
        ['V1', 'W1', 'X1', 'Y1', 'Z1'],
        ['V2', 'W2', 'X2', 'Y2', 'Z2'],
    ]
})

Вы можете переформатировать столбцы, применив pd.Series и конкатенируя результаты.

print(pd.concat([
    df[i].apply(pd.Series) for i in df.columns
]).sort_index().reset_index(drop=True))

      0     1     2     3     4
0  None     A     B     C     D
1  None  None  None  None  None
2     V     W     X     Y     Z
3  None    A1    B1    C1    D1
4  None  None  None  None  None
5    V1    W1    X1    Y1    Z1
6  None    A2    B2    C2    D2
7  None  None  None  None  None
8    V2    W2    X2    Y2    Z2

Другой метод без использованияpd.concat:

print(df.stack().reset_index(drop=True).apply(pd.Series))

      0     1     2     3     4
0  None     A     B     C     D
1  None  None  None  None  None
2     V     W     X     Y     Z
3  None    A1    B1    C1    D1
4  None  None  None  None  None
5    V1    W1    X1    Y1    Z1
6  None    A2    B2    C2    D2
7  None  None  None  None  None
8    V2    W2    X2    Y2    Z2

Этот первый метод завершается в

  • 3.93 ms ± 154 µs per loop (mean ± std. dev. of 7 runs, 100 loops each

Второй метод завершается в

  • 2.34 ms ± 66.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Ваш исходный код завершается в

  • 15 ms ± 340 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
0 голосов
/ 03 октября 2019

IIUC, вы можете получить желаемый результат с этим.

Вход

                   group    count                       value
0   [None, A, B, C, D]      [None, None, None, None]    [v, w, x, y, z]
1   [None, A1, B1, C1, D1]  [None, None, None, None]    [v1, w1, x1, y1, z1]
2   [None, A2, B2, C2, D2]  [None, None, None, None]    [v2, w2, x2, y2, z2]

Код

df1 = df.stack().droplevel(1).reset_index(name='col').drop('index',axis=1)
pd.DataFrame(df1['col'].values.tolist(), columns=['M','N','O','P','Q'])

Выход

      M     N   O   P   Q
0   None    A   B   C   D
1   None    None    None    None    None
2   v   w   x   y   z
3   None    A1  B1  C1  D1
4   None    None    None    None    None
5   v1  w1  x1  y1  z1
6   None    A2  B2  C2  D2
7   None    None    None    None    None
8   v2  w2  x2  y2  z2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...