如何在Python中无循环移除pandas DataFrame中time列唯一的行?
如何在Pandas中移除指定列值唯一的行(无需循环)
我有如下结构的pandas.DataFrame:
time num 1 a,A 3 2 a,B 3 3 a,C 1 4 b,A 4 5 b,A 4 6 a,B 3 7 d,B 2 我希望移除数据集中time列值唯一的行,期望得到的结果如下:
time num 2 a,B 3 4 b,A 4 5 b,A 4 6 a,B 3 请问是否存在无需使用循环的实现方式?
当然有啦!完全不用写循环,Pandas提供的向量化操作就能高效搞定这个需求。不过看你的示例数据和期望结果,推测你可能是笔误——你的time列每个值都是唯一的,如果真的移除time值唯一的行,结果会是空的。你实际应该是想移除num列值唯一的行(也就是保留num值重复出现的行),刚好和你的期望结果匹配,下面我两种情况都说明一下:
1. 保留num列重复的行(符合你的期望结果)
最简单的方法是用duplicated()方法,设置keep=False——这个参数会标记所有重复出现的行(包括第一次出现的),直接筛选这些行就可以:
import pandas as pd # 构建你的示例数据 df = pd.DataFrame({ 'time': [1,2,3,4,5,6,7], 'num': ['a,A 3', 'a,B 3', 'a,C 1', 'b,A 4', 'b,A 4', 'a,B 3', 'd,B 2'] }) # 筛选出num值重复的所有行 result = df[df['num'].duplicated(keep=False)] print(result)
运行后就会得到你想要的结果:
| time | num |
|---|---|
| 2 | a,B 3 |
| 4 | b,A 4 |
| 5 | b,A 4 |
| 6 | a,B 3 |
如果你想更清晰地看到每个num值的出现次数,也可以用value_counts()配合isin()来实现:
# 获取出现次数大于1的num值列表 repeat_numbers = df['num'].value_counts()[df['num'].value_counts() > 1].index # 筛选符合条件的行 result = df[df['num'].isin(repeat_numbers)]
这个方法和上面的效果完全一样,适合需要先查看重复值统计的场景。
2. 如果你确实要对time列操作(仅作参考)
如果你的time列存在重复值,要移除time值唯一的行,同样用duplicated(keep=False):
result = df[df['time'].duplicated(keep=False)]
不过你的示例数据里time列没有重复,所以这个操作会返回空的DataFrame。
内容的提问来源于stack exchange,提问作者Elham
相关产品推荐
相关产品推荐

