Pandas - 保留具有确定值的行并删除其余行
Pandas - Keeping rows with determined values and droping the rest
所以,我有这样一个数据框(重要的列是第三列):
| ABC | DEF | fruit |
----------------------------
1 | 12 | LO | banana
2 | 45 | KA | orange
3 | 65 | JU | banana
4 | 25 | UY | grape
5 | 23 | TE | apple
6 | 28 | YT | orange
7 | 78 | TR | melon
我想保留出现次数最多的 5 个水果的行并删除其余的,所以我创建了一个变量来保存这些水果以保存在列表中,如下所示:
fruits = df['fruit'].value_counts()
fruits_to_keep = fruits[:5].reset_index()
fruits_to_keep.drop(['fruit'], inplace=True, axis=1)
fruits_to_keep = fruits_to_keep.to_numpy()
fruits_to_keep = fruits_to_keep.tolist()
fruits_to_keep
[['banana'],['orange'],[apple],[melon],[grape]]
我觉得我做了不必要的步骤,但无论如何,当我尝试 select 包含那些 fruits_to_keep
的行时,问题就出现了
df = df.set_index('fruit')
df = df.loc[fruits_to_keep,:]
然后我得到关键错误说“None of [Index([('banana',), \n ('orange',), \n ('apple',)...... dtype='object', name='fruit')] 都在[index]"
我也试过:
df[df.fruit in fruits_to_keep]
但随后出现以下错误:
('Lengths must match to compare', (43987,), (1,))
Obs.:我实际上有 43k 行,其中许多 'fruits' 我不希望出现在数据框上,还有 30k+ 行,其中 5 行出现次数最多 'fruits'
提前致谢!
要保留具有前 N 个值的行,您可以使用 value_counts
和 isin
。
默认情况下,value_counts
returns 元素按频率降序排列。
N = 5
df[df['col'].isin(df['col'].value_counts().index[:N])]
所以,我有这样一个数据框(重要的列是第三列):
| ABC | DEF | fruit |
----------------------------
1 | 12 | LO | banana
2 | 45 | KA | orange
3 | 65 | JU | banana
4 | 25 | UY | grape
5 | 23 | TE | apple
6 | 28 | YT | orange
7 | 78 | TR | melon
我想保留出现次数最多的 5 个水果的行并删除其余的,所以我创建了一个变量来保存这些水果以保存在列表中,如下所示:
fruits = df['fruit'].value_counts()
fruits_to_keep = fruits[:5].reset_index()
fruits_to_keep.drop(['fruit'], inplace=True, axis=1)
fruits_to_keep = fruits_to_keep.to_numpy()
fruits_to_keep = fruits_to_keep.tolist()
fruits_to_keep
[['banana'],['orange'],[apple],[melon],[grape]]
我觉得我做了不必要的步骤,但无论如何,当我尝试 select 包含那些 fruits_to_keep
的行时,问题就出现了df = df.set_index('fruit')
df = df.loc[fruits_to_keep,:]
然后我得到关键错误说“None of [Index([('banana',), \n ('orange',), \n ('apple',)...... dtype='object', name='fruit')] 都在[index]"
我也试过:
df[df.fruit in fruits_to_keep]
但随后出现以下错误: ('Lengths must match to compare', (43987,), (1,))
Obs.:我实际上有 43k 行,其中许多 'fruits' 我不希望出现在数据框上,还有 30k+ 行,其中 5 行出现次数最多 'fruits'
提前致谢!
要保留具有前 N 个值的行,您可以使用 value_counts
和 isin
。
默认情况下,value_counts
returns 元素按频率降序排列。
N = 5
df[df['col'].isin(df['col'].value_counts().index[:N])]