Pandas распределяет значения элемента списка столбца в n разных столбцов

78
11

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

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

спросил(а) 2021-01-25T17:36:58+03:00 4 месяца, 4 недели назад
1
Решение
63

Для новых столбцов лучше использовать 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

ответил(а) 2021-01-25T17:36:58+03:00 4 месяца, 4 недели назад
45

Вот один из способов:

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

Вы также можете назвать столбцы в фреймворке temp:

# 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)

ответил(а) 2021-01-25T17:36:58+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема