Python pandas - разделение строк, в которых хранится список, а не одно значение - PullRequest
0 голосов
/ 31 октября 2018

У меня огромный массив данных с несколькими типами столбцов - string, boolean, integer, float (это важно, потому что это означает, что я не могу использовать np.repeat для этой проблемы. Вот почему я спрашиваю свой собственный, потому что Я считаю, что подобные решения здесь не работают для меня. Или это, или я не знаю, как!). Ну, один из моих столбцов - это идентификационный номер, и по некоторым причинам в некоторых строках есть несколько номеров, перечисленных в разделе ID. Как то так:

i  ID            Name        Boolean1  Boolean2   etc
0  2755          Blahblah1   True      False      ...
1  2894, 4755    PainInMy2   True      True       ...
2  331           Blehblue    False     False      ...

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

i  ID      Name        Boolean1  Boolean2   etc
0  2755    Blahblah1   True      False      ...
1  2894    PainInMy2   True      True       ...
2  4755    PainInMy2   True      True       ...
3  331     Blehblue    False     False      ...

Каким элегантным образом я могу этого достичь? Имейте в виду, что это огромный Pandas DF с сотнями тысяч строк и дюжиной столбцов разных типов; и я хотел бы сохранить большинство, если не все, метаданных pandas df. Я могу разделить его на серии for с и if с, но я чувствую, что должен быть более простой, возможно, всего несколько строк, способ сделать это. Может быть с split(',') или чем-то подобным. Но я не могу понять, как. Спасибо!

(Пожалуйста, не отмечайте это как дубликат. Я не смог найти ответ, который работал бы для меня!)

1 Ответ

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

Вы можете использовать методы pandas str, чтобы разделить ячейку на данном разделителе и стек, чтобы разложить на несколько строк. Установите остальные столбцы в качестве индекса, чтобы гарантировать, что данные соответствуют правильному значению.

df.set_index(['Name', 'Boolean1', 'Boolean2']).ID.str.split(',', expand=True)\
.stack().reset_index(3,drop = True).reset_index()\
.rename(columns = {0 : 'ID'})

Вы получаете

    Name       Boolean1 Boolean2  ID
0   Blahblah1   True    False     2755
1   PainInMy2   True    True      2894
2   PainInMy2   True    True      4755
3   Blehblue    False   False     331
...