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

标签 python string list pandas dataframe

假设我有一个 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]

关于python - 根据条件从列表的数据框列中计算和删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46191946/

相关文章:

android - String[] 数组无法正常工作

python - 显示直方图条形轮廓

python - 为什么在 Python 的 `lambda` 表达式中不允许赋值?

python - DataFrame.resample ('M' )不给出每月 AVERAGE 值,而只给出每月总和

python - 比较许多列表的某些索引

c# - 内存不足异常

c# - 合并具有相同索引的列表?

python - 将 QmouseEvent 转换为 QGraphicsSceneMouseEvent 以进行拖动移动

java - 将字符串替换为null

javascript - 如何检查字符串是否包含 JavaScript 中子字符串数组中的文本?