如何限制Python中的列重复

2024-04-23 19:10:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想选择一列中元素的总重复次数少于3次的行。具体来说,我有一个电话号码,姓名和城市的大目录。我想导出一个只包含“小城市”的列表,这样在文档中,任何包含少于三个条目的城市的行都会被保留。比如说

Name, City, State
Foo, L.A., CA
Bar, L.A., CA
Sam, L.A., CA
Tricia, Kent, WA
Bob, Kent, WA
Ida, Boo, PA
Monster Mash, Whack, PA
Zoomacroom, L.A., CA
Otter Pop, Boo, PA
Snake, HP, WA
Ronnie the Bear, Boo, PA

应该变成:

Name, City, State
Tricia, Kent, WA
Bob, Kent, WA
Snake, HP, WA
Monster Mash, Whack, PA

我也不必使用pandas-我可以很容易地使用csv;我只是碰巧已经在我的清理脚本中导入了它。你知道吗


Tags: namecitycahpbobstatemashsnake
3条回答

编辑:我思考OP在发布的前5分钟内更改了所需的数据帧。这个答案描述了如何删除所有列中的重复(不仅仅是对于这个城市/州的具体例子,在那里这没有太多意义)。

您可以对单个列执行此操作(删除出现3次以上的城市名称):

In [11]: g = df.groupby('City')

In [12]: g.filter(lambda x: len(x['City']) < 4)
Out[12]: 
               Name   City State
5               Ida    Boo    PA
8         Otter Pop    Boo    PA
10  Ronnie the Bear    Boo    PA
9             Snake     HP    WA
3            Tricia   Kent    WA
4               Bob   Kent    WA
6      Monster Mash  Whack    PA

在所有列中都要这样做(这有点混乱!但是,您可以为任意帧创建一个函数来执行此操作……:

In [13]: less_than_4 = ((df.groupby('City').City.transform(lambda x: len(x) < 4))
                      & (df.groupby('State').State.transform(lambda x: len(x) < 4))
                      & ((df.groupby('Name').Name.transform(lambda x: len(x) < 4))))

In [14]: df[less_than_4]
Out[14]: 
     Name  City State
3  Tricia  Kent    WA
4     Bob  Kent    WA
9   Snake    HP    WA

更优雅一点:

from operator import and_
df[reduce(and_, (df.groupby(col)[col].transform(lambda x: len(x) < 4)
                      for col in df.columns))]

比如说:

>>> small_cities = df.groupby(["City", "State"]).filter(lambda x: x.count() < 3)
>>> small_cities
           Name   City State
3        Tricia   Kent    WA
4           Bob   Kent    WA
6  Monster Mash  Whack    PA
9         Snake     HP    WA

[4 rows x 3 columns]

大致如下:

with open(filename) as f:
    content = f.readlines()
for line in set(content):
    if content.count([-2:]) < 4:
        output.append(line[-2:])

希望这有帮助

相关问题 更多 >