如何删除有限的行数?到目前为止,我的代码删除了我给出的每个实例。因此,在下面的例子中,“狗”的每一个实例都被删除。然而,我想删除指定数量的实例,因此,例如只丢弃2个实例的狗,这也将是一个好处,如果要下降的实例是随机抽样。
num = [10, 20, 30, 10, 40, 50, 20, 60, 70, 20]
color = ['red', 'white', 'black', 'green', 'white', 'orange', 'white', 'black', 'blue', 'red']
animal = ['dog', 'cat', 'raccoon', 'gecko', 'bear', 'raccoon', 'dog', 'goat', 'goat', 'dog']
dict = {'Number': num, 'Color': color, 'Animal': animal}
df = pd.DataFrame(dict)
to_drop = ['dog']
trimmed_df = df[~df['Animal'].isin(to_drop)]发布于 2021-04-05 16:43:04
如果多个动物和不同的数量,你可以groupby + sample。将动物和数量储存在一个小块中,然后重新整理正确的数字。
这将随机下降,如果指定一个大于行数的N,则它会为该动物删除所有行。
to_drop = {'dog': 2, 'raccoon': 1}
l = []
for animal, gp in df.groupby('Animal'):
l.append(gp.sample(n=max(0, len(gp)-to_drop.get(animal, 0)), replace=False))
pd.concat(l).sort_index() Number Color Animal
1 20 white cat
3 10 green gecko
4 40 white bear
5 50 orange raccoon
7 60 black goat
8 70 blue goat
9 20 red dog上面的方法效率不高,所以利用@QuangHoang的聪明想法来累积计数,我们首先对整个DataFrame (.sample(frac=1))进行洗牌,这样我们就可以随机丢弃行,然后将累积计数与裁剪进行比较。
to_drop = {'dog': 2, 'raccoon': 1}
m = (df.sample(frac=1).groupby('Animal').cumcount()
.lt(df['Animal'].map(to_drop)))
df = df[~m]发布于 2021-04-05 16:40:41
你可以试试:
to_drop = ['dog']
s = df['Animal'].isin(to_drop)
mask = s & s.cumsum().le(2)
df[~mask]输出:
Number Color Animal
1 20 white cat
2 30 black raccoon
3 10 green gecko
4 40 white bear
5 50 orange raccoon
7 60 black goat
8 70 blue goat
9 20 red dogto_drop,:在这种情况下,to_drop有多个标签,您希望在中删除2个实例,每个都可以执行groupby().cumcount()
mask = (df['Animal'].isin(to_drop) &
df.groupby('Animal').cumcount().lt(2)
)
print(df[~mask])https://stackoverflow.com/questions/66956423
复制相似问题