首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据帧中删除指定的行

问从数据帧中删除指定的行
EN

Stack Overflow用户
提问于 2021-04-05 16:38:11
回答 2查看 42关注 0票数 2

如何删除有限的行数?到目前为止,我的代码删除了我给出的每个实例。因此,在下面的例子中,“狗”的每一个实例都被删除。然而,我想删除指定数量的实例,因此,例如只丢弃2个实例的狗,这也将是一个好处,如果要下降的实例是随机抽样。

代码语言:javascript
复制
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)]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-05 16:43:04

如果多个动物和不同的数量,你可以groupby + sample。将动物和数量储存在一个小块中,然后重新整理正确的数字。

这将随机下降,如果指定一个大于行数的N,则它会为该动物删除所有行。

代码语言:javascript
复制
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()

代码语言:javascript
复制
   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))进行洗牌,这样我们就可以随机丢弃行,然后将累积计数与裁剪进行比较。

代码语言:javascript
复制
to_drop = {'dog': 2, 'raccoon': 1}

m = (df.sample(frac=1).groupby('Animal').cumcount()
       .lt(df['Animal'].map(to_drop)))
df = df[~m]
票数 1
EN

Stack Overflow用户

发布于 2021-04-05 16:40:41

你可以试试:

代码语言:javascript
复制
to_drop = ['dog']
s = df['Animal'].isin(to_drop)

mask = s & s.cumsum().le(2)

df[~mask]

输出:

代码语言:javascript
复制
   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      dog

to_drop,:在这种情况下,to_drop有多个标签,您希望在中删除2个实例,每个都可以执行groupby().cumcount()

代码语言:javascript
复制
mask = (df['Animal'].isin(to_drop) &
        df.groupby('Animal').cumcount().lt(2)
       )
print(df[~mask])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66956423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档