Python - как разбить список для создания нового столбца?панд - PullRequest
0 голосов
/ 23 октября 2018

У меня есть такой фрейм данных

    col1    col2 
    [A, B]   1
    [A, C]   2

Я бы хотел разделить столбец col1 на два столбца и вывод, я хотел бы получить его в этой форме

col1_A  col1_B  col2
  A       B       1
  A       C       2

Iпопробовал это df['col1'].str.rsplit(',',n=2, expand=True) но он показал TypeError: list indices must be integers or slices, not str

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Zip-значения и имя столбца и использование вставки для получения правильной позиции.

for ind,(k,v) in enumerate(zip(zip(*df.pop('col1').tolist()),['col1_A', 'col1_B'])):
    df.insert(ind, v, k)

Полный пример

import pandas as pd

df = pd.DataFrame({
    "col1": [['A', 'B'], ['A', 'C']],
    "col2": [1, 2],
})

for ind,(k,v) in enumerate(zip(zip(*df.pop('col1').tolist()),['col1_A', 'col1_B'])):
    df.insert(ind, v, k)

print(df)

Возвращает:

  col1_A col1_B  col2
0      A      B     1
1      A      C     2
0 голосов
/ 23 октября 2018

Вы можете сделать это:

>> df_expanded = df['col1'].apply(pd.Series).rename(
     columns = lambda x : 'col1_' + str(x))

>> df_expanded

  col1_0 col1_1
0      A      B
1      A      C

Добавление этих столбцов к исходному фрейму данных:

>> pd.concat([df_expanded, df], axis=1).drop('col1', axis=1)

  col1_0 col1_1  col2
0      A      B     1
1      A      C     2

Если столбцы должны быть названы в качестве первого элемента в строках:

df_expanded.columns =  ['col1_' + value
                        for value in df_expanded.iloc[0,:].values.tolist()]

  col1_A col1_B
0      A      B
1      A      C
0 голосов
/ 23 октября 2018

join + pop

df = df.join(pd.DataFrame(df.pop('col1').values.tolist(),
                          columns=['col1_A', 'col1_B']))

print(df)

   col2 col1_A col1_B
0     1      A      B
1     2      A      C

Хорошей практикой является попытка избежать pd.Series.apply, что часто составляет цикл уровня Pythonс дополнительными накладными расходами.

0 голосов
/ 23 октября 2018

Вы можете использовать применить :

import pandas as pd
df = pd.DataFrame({
    "col1": [['A', 'B'], ['A', 'C']],
    "col2": [1, 2],
})
df['col1_A'] = df['col1'].apply(lambda x: x[0])
df['col1_B'] = df['col1'].apply(lambda x: x[1])
del df['col1']
df = df[df.columns[[1,2,0]]]
print(df)

  col1_A col1_B  col2
0      A      B     1
1      A      C     2
...