Разделение фрейма данных Pandas на несколько фреймов в зависимости от условия в столбце - PullRequest
0 голосов
/ 03 февраля 2019

Чтобы правильно подготовить мои данные к задаче ML, мне нужно иметь возможность разбить мой исходный кадр данных на несколько меньших кадров данных.Я хочу получить все строки выше, включая строку, в которой значение для столбца 'BOOL' равно 1 - для каждого вхождения 1. т. Е. N фреймов данных, где n - это число вхождений, равное 1.

Примерданных:

df = pd.DataFrame({"USER_ID": ['001', '001', '001', '001', '001'],
'VALUE' : [1, 2, 3, 4, 5], "BOOL": [0, 1, 0, 1, 0]})

Ожидаемый вывод составляет 2 кадра данных, как показано:

enter image description here

И:

enter image description here

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

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

Вы можете использовать np.split, который принимает массив индексов, где необходимо разделить:

np.split(df, *np.where(df.BOOL == 1))

Если вы хотите включить строки с BOOL == 1 в предыдущий кадр данныхВы можете просто добавить 1 ко всем индексам:

np.split(df, np.where(df.BOOL == 1)[0] + 1)
0 голосов
/ 03 февраля 2019

Почему бы не составить список?как:

>>> l=[df.iloc[:i+1] for i in df.index[df['BOOL']==1]]
>>> l[0]
   BOOL USER_ID  VALUE
0     0     001      1
1     1     001      2
>>> l[1]
   BOOL USER_ID  VALUE
0     0     001      1
1     1     001      2
2     0     001      3
3     1     001      4
>>> 
0 голосов
/ 03 февраля 2019

Я думаю, что лучше использовать цикл for

idx=df.BOOL.nonzero()[0]

d={x : df.iloc[:y+1,:] for x , y in enumerate(idx)}
d[0]
   BOOL USER_ID  VALUE
0     0     001      1
1     1     001      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...