У меня есть фреймворк pandas со многими столбцами. Один из них - сериал. Я хочу разбить этот столбец на набор логических столбцов. Итак, если значение в строке ['Red', 'Hot', 'Summer'], мне нужны 3 столбца: Red (со значением 1), Hot (со значением 1) и Summer (со значением 1).

Примере:

df = pd.DataFrame({'Owner': ['Bob', 'Jane', 'Amy'],
               'Make': ['Ford', 'Ford', 'Jeep'],
               'Model': ['Bronco', 'Bronco', 'Wrangler'],
               'Sentiment': [['Meh','Red','Dirty'], ['Rusty','Sturdy'], ['Dirty','Red']],
               'Max Speed': [80, 150, 69],
              'Customer Rating': [90, 50, 91]})

Дает нам:

enter image description here

Теперь мне нужен такой результат: введите описание изображения здесь (Истина / Ложь тоже могут быть единицами и нулями. Так же хорошо).

Примечание: я просмотрел этот пост ниже: Разделить столбец списков Pandas на несколько столбцов но это напрямую работает только в том случае, если ваша серия еще не является частью DF.

Любая помощь приветствуется!

-1
Alex P 24 Ноя 2021 в 05:59
Вау, это неплохо! ... но этот ответ ниже: df = pd.concat ([df, pd.get_dummies (df ['Sentiment']. explode ())], axis = 1) умножает количество строк. Я просто хочу разбить один столбец на несколько столбцов, не меняя количество строк.
 – 
Alex P
24 Ноя 2021 в 06:17
Спасибо вам обоим. БЕНИ - это именно то, что я хотел - идеально!
 – 
Alex P
24 Ноя 2021 в 06:40
Отлично, @AlexP! Я не совсем уверен, что у BENY лучше, чем могло бы, но ... :)
 – 
user17242583
24 Ноя 2021 в 06:57

2 ответа

Лучший ответ

Попробуйте explode, затем corsstab и join

s = df.Sentiment.explode()
out = df.join(pd.crosstab(s.index,s).astype(bool))
out
  Owner  Make     Model          Sentiment  ...    Meh    Red  Rusty  Sturdy
0   Bob  Ford    Bronco  [Meh, Red, Dirty]  ...   True   True  False   False
1  Jane  Ford    Bronco    [Rusty, Sturdy]  ...  False  False   True    True
2   Amy  Jeep  Wrangler       [Dirty, Red]  ...  False   True  False   False
[3 rows x 11 columns]
2
BENY 24 Ноя 2021 в 06:25

Попробуй это:

df = pd.concat([df, pd.get_dummies(df['Sentiment'].explode())], axis=1)

Выход:

>>> df
  Owner  Make     Model             Sentiment  Max Speed  Customer Rating  AWESOME  Dirty  LOVE  Meh  Red  Rusty  Sturdy
0   Bob  Ford    Bronco     [Meh, Red, Dirty]         80               90        0      0     0    1    0      0       0
0   Bob  Ford    Bronco     [Meh, Red, Dirty]         80               90        0      0     0    0    1      0       0
0   Bob  Ford    Bronco     [Meh, Red, Dirty]         80               90        0      1     0    0    0      0       0
1  Jane  Ford    Bronco       [Rusty, Sturdy]        150               50        0      0     0    0    0      1       0
1  Jane  Ford    Bronco       [Rusty, Sturdy]        150               50        0      0     0    0    0      0       1
2   Amy  Jeep  Wrangler  [LOVE, AWESOME, Red]         69               91        0      0     1    0    0      0       0
2   Amy  Jeep  Wrangler  [LOVE, AWESOME, Red]         69               91        1      0     0    0    0      0       0
2   Amy  Jeep  Wrangler  [LOVE, AWESOME, Red]         69               91        0      0     0    0    1      0       0

Как это работает

То, что вы ищете, обычно называется горячим кодированием , и в пандах есть метод только для этого: get_dummies(). Он принимает серию (или DataFrame) и создает новый столбец для каждого уникального значения в этой серии (или DataFrame).

df['Sentiment'].explode() создает новый столбец, содержащий все отдельные значения всех списков в выбранном столбце (столбцах).

0
user17242583 24 Ноя 2021 в 06:56