Как удалить случайные строки из кадра данных Pandas на основе записи в столбце? - PullRequest
0 голосов
/ 02 марта 2019

У меня есть набор данных ~ 3700 строк, и мне нужно удалить 1628 из этих строк на основе столбца.Набор данных выглядит следующим образом:

compliance  day0  day1  day2  day3  day4
True        1     3     9     8     8
False       7     4     8     3     2
True        4     5     0     3     5
True        5     3     9     6     2

для 1068 строк. Я хочу удалить всю строку, если соответствие = true.

Дело в том, что я хочу сделать это случайно;Я не хочу удалять первые 1063 строки.Я попробовал это:

for z in range(1629):
    rand = random.randint(0,(3783-z)) #subtract z since dataframe shape is shrinking
    if str(data.iloc[rand,1]) == 'True':
        data = data.drop(balanced_dataset.index[rand])

Но я получаю следующую ошибку, после того как он удаляет несколько строк:

 'labels [2359] not contained in axis'

Я также пробовал это:

data.drop(data("adherence.str.startswith('T').values").sample(frac=.4).index)

ГРП произвольно выбрано на данный момент, я просто хотел, чтобы это работало.Я получил следующую ошибку:

'DataFrame' object is not callable

Любая помощь будет принята с благодарностью!Спасибо

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Используйте sample с drop:

n = 1068
# Do this first if you haven't already.
# df.compliance = df.compliance.map(pd.eval)
df_dropped = df.drop(df[df.compliance].sample(n=n).index)

Чтобы это работало, n должно быть строго меньше, чем отфильтрованный DataFrame.


Примеротбрасывает два ряда случайно.

df.drop(df[df.compliance].sample(n=2).index)

   compliance  day0  day1  day2  day3  day4
1       False     7     4     8     3     2
3        True     5     3     9     6     2
0 голосов
/ 02 марта 2019

Вы можете попробовать:

df_dropped = df.drop(df.loc[df.compliance, :]).sample(n=fraction).index)

0 голосов
/ 02 марта 2019

Это сработало для меня: вы генерируете список индексов, из которых вы хотите удалить элемент (в вашем случае Compliance==True).Затем вы выбираете случайным образом (без замены) из этого списка столько элементов, сколько вы хотели бы удалить.Затем вы удаляете их из DataFrame

to_remove = np.random.choice(data[data['Compliance']==True].index,size=1068,replace=False)
data.drop(to_remove)
...