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