我有一个约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行,如果compliance = 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
任何帮助将不胜感激!谢谢
使用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
这对我有用:你生成一个你想要删除元素的索引列表(在你的情况下是Compliance==True
)。然后从该列表中随机选择(无需替换)您想要删除的元素。然后从DataFrame中删除它们
to_remove = np.random.choice(data[data['Compliance']==True].index,size=1068,replace=False)
data.drop(to_remove)
你可以试试:
df_dropped = df.drop(df.loc[df.compliance, :]).sample(n=fraction).index)