Skip to main content
 首页 » 编程设计

python之根据条件从列表的数据框列中计算和删除元素

2025年05月04日13myhome

假设我有一个 Pandas df

      col_name 
1    [16, 4, 30]    
2    [5, 1, 2]    
3    [4, 5, 52, 888] 
4    [1, 2, 4] 
5    [5, 99, 4, 75, 1, 2] 

我想删除整个列中出现少于 x 次的所有元素,例如让我们取 x = 3

这意味着我希望结果看起来像这样:

      col_name 
1    [4]    
2    [5, 1, 2]    
3    [4, 5] 
4    [1, 2, 4] 
5    [5, 4, 1, 2] 

结果 df 基本上去掉了数字 16、30、52、888、99 和 75,因为它在列中出现的次数少于 3 次。

我尝试使用 collections 中的 Counter 但它没有用。

如果您能给我任何提示,我将不胜感激。提前致谢。

请您参考如下方法:

选项 1
有点普通的 Vanilla 方法

s = pd.Series({(i, j): x for (i, r) in df.col_name.items() for j, x in enumerate(r)}) 
 
f, u = pd.factorize(s.values) 
 
s[(np.bincount(f) >= 3)[f]].groupby(level=0).apply(list).to_frame('col_name') 
 
       col_name 
0           [4] 
1     [5, 1, 2] 
2        [4, 5] 
3     [1, 2, 4] 
4  [5, 4, 1, 2] 

选项 2
过度复杂的方法

lens = df.col_name.str.len().values 
splits = lens.cumsum()[:-1] 
values = np.concatenate(df.col_name.values) 
f, u = pd.factorize(values) 
b = np.bincount(f) 
r = np.arange(len(df)).repeat(lens) 
m = (b >= 3)[f] 
new_splits = splits - np.bincount(r, ~m).astype(int).cumsum()[:-1] 
new_values = np.split(values[m], new_splits) 
df.assign(col_name=new_values) 
 
       col_name 
0           [4] 
1     [5, 1, 2] 
2        [4, 5] 
3     [1, 2, 4] 
4  [5, 4, 1, 2]