Панды распределяют значения элемента списка столбца на n разных столбцов - PullRequest
0 голосов
/ 12 июня 2018

У меня есть Pandas DataFrame, который содержит имя столбца RecentDelays, в котором он содержит список элементов. Мой DataFrame

Необходимо разбить этот столбец RecentDelays на N различных столбцов, таких как Delay1, Delay2, .... с первым значением списка в столбце Delay1 соответствующей строки, вторым значением в Delay2столбец соответствующей строки и т. д. Если нет n-го значения, оно должно быть NaN

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Для новых столбцов лучше использовать DataFrame contructor, потому что .apply(pd.Series) медленный, отметьте это время , последний join до оригинала:

#jedwards data sample
d1 = pd.DataFrame({'Airline':['A','B','C'],'Delays':[[],[1],[1,2]]})

d2 = (pd.DataFrame(d1['Delays'].values.tolist(), index=d1.index)
        .rename(columns = lambda x: 'Delay{}'.format(x+1)))

df = d1.join(d2)
print (df)
  Airline  Delays  Delay1  Delay2
0       A      []     NaN     NaN
1       B     [1]     1.0     NaN
2       C  [1, 2]     1.0     2.0

Если необходимо удалить столбец, используйте pop сначала:

d2 = (pd.DataFrame(d1.pop('Delays').values.tolist(), index=d1.index)
        .rename(columns = lambda x: 'Delay{}'.format(x+1)))

df = d1.join(d2)
print (df)
  Airline  Delay1  Delay2
0       A     NaN     NaN
1       B     1.0     NaN
2       C     1.0     2.0
0 голосов
/ 12 июня 2018

Вот один метод:

import pandas as pd

d1 = pd.DataFrame({'Airline':['A','B','C'],'Delays':[[],[1],[1,2]]})

# Expand column into temporary Dataframe
d2 = d1['Delays'].apply(pd.Series)

# Integrate temp columns back into original Dataframe (while naming column)
for col in d2:
    d1["Delay%d" % (col+1)] = d2[col]

print(d1)

До:

  Airline  Delays
0       A      []
1       B     [1]
2       C  [1, 2]

После:

  Airline  Delays  Delay1  Delay2
0       A      []     NaN     NaN
1       B     [1]     1.0     NaN
2       C  [1, 2]     1.0     2.0

Вы также можете назвать столбцы во временном кадре данных с помощью:

# Name columns of new dataframe
d2.columns = ["Delay%d" % (i+1) for i in range(len(d2.columns))]

А затем используйте concat.

Вы также можете удалить теперь расширенный столбец «Задержки», например:

d1.drop(columns=['Delays'], inplace=True) # or,
d1.drop(['Delays'], axis=1, inplace=True)
...