Python - Pandas, сводный список длины варианта в аккуратный набор данных - PullRequest
2 голосов
/ 16 апреля 2020

У меня есть следующий фрейм данных, каждая строка является строкой конкатенации имен событий:

0                                              event_1
1                                          other_event
2    other_event, other_event, other_event, other_e...
3    event_3, other_event, other_event, other_event...
4                              some_event, other_event
5    event_1, event_5, some_event, some_event, some...
6                        event_5, event_6, other_event
7                                              event_1

Я хотел бы разбить каждую строку, агрегировать по имени события и создать аккуратный набор данных, который будет выглядит так:

+---+--------+------------+--------+-----------+--------+--------+
|id |event_1 |other_event |event_3 |some_event |event_5 |event_6 |
+---+--------+------------+--------+-----------+--------+--------+
|0  |1       |0           |0       |0          |0       |0       |
+---+--------+------------+--------+-----------+--------+--------+
|1  |0       |1           |0       |0          |0       |0       |
+---+--------+------------+--------+-----------+--------+--------+
|2  |0       |4           |0       |0          |0       |0       |
+---+--------+------------+--------+-----------+--------+--------+
|3  |0       |3           |1       |0          |0       |0       |
+---+--------+------------+--------+-----------+--------+--------+
|4  |0       |1           |0       |1          |0       |0       |
+---+--------+------------+--------+-----------+--------+--------+
|5  |1       |0           |0       |3          |1       |0       |
+---+--------+------------+--------+-----------+--------+--------+
|6  |0       |1           |0       |0          |1       |1       |
+---+--------+------------+--------+-----------+--------+--------+
|7  |1       |0           |0       |0          |0       |0       |
+---+--------+------------+--------+-----------+--------+--------+

Я использовал df["events_array"].str.split(","), но застрял там, любая помощь будет оценена по адресу:)

1 Ответ

1 голос
/ 16 апреля 2020

Первая идея - использовать Counter в списочном понимании для словаря списков и перейти к конструктору DataFrame, заменить отсутствующие значения и преобразовать в целые числа:

from collections import Counter

df = pd.DataFrame([Counter(x.split(", ")) for x in df["events_array"]]).fillna(0).astype(int)
print (df)
   event_1  other_event  event_3  some_event  event_5  event_6
0        1            0        0           0        0        0
1        0            1        0           0        0        0
2        0            4        0           0        0        0
3        0            3        1           0        0        0
4        0            1        0           1        0        0
5        1            0        0           3        1        0
6        0            1        0           0        1        1
7        1            0        0           0        0        0

Или возможно создать DataFrame с помощью Series.str.split и expand=True, а затем считается value_counts на строки в apply:

df = (df["events_array"].str.split(', ', expand=True)
                        .apply(pd.value_counts, 1)
                        .fillna(0)
                        .astype(int)
                        )
print (df)
   event_1  event_3  event_5  event_6  other_event  some_event
0        1        0        0        0            0           0
1        0        0        0        0            1           0
2        0        0        0        0            4           0
3        0        1        0        0            3           0
4        0        0        0        0            1           1
5        1        0        1        0            0           3
6        0        0        1        1            1           0
7        1        0        0        0            0           0
...