熊猫数据框-选择相似的行

时间:2020-08-12 12:08:36

标签: python pandas dataframe

有没有办法在熊猫数据框中选择“相似”(不重复!)的行?

我有一个dataframe,其列包括'school_name''district'

我想看看在不同地区中是否有任何具有相似名称的学校。

我能想到的是选择一个随机的学校名称,并通过运行类似的命令来手动检查dataframe中是否存在类似的名称:

df[df['school_name'].str.contains('english grammar')] 

有没有更有效的方法?

编辑:我最终要在school_name列上将此特定数据框与另一个数据框进行字符串匹配,同时在district列上进行阻塞。问题在于,由于地区名称随时间而变化,因此两个数据框中的某些地区名称不完全匹配-df1是从2000年开始的,它具有“ city-i”,“ city-ii” ...格式的地区,而从2020年开始的df2则采用“ city-south”,“ city-north” ...格式的地区。名称随时间而变化,对地区进行了改组以合并/分离等。

所以我试图删除'i','ii','south'等以阻止'city'。在此之前,我想确保在“ city-i”和“ city-south”中没有相似发音的名称,(因为如果学校实际上位于一个完全不同的地区)。

3 个答案:

答案 0 :(得分:0)

您可以设置两组,一组将包含学校名称,而另一组将包含遍历,如果在遍历列中的每个学校名称时遇到重复项

school=set()
duplicate=set()
for i in df1.schl_name:
    if i not in school:
        school.add(i)
    else:
        duplicate.add(i)

df1[df1['schl_name'].isin(duplicate)]

答案 1 :(得分:0)

我们说这是您的DataFrame。

df = pd.DataFrame({'school':['High School',
                             'High School',
                             'Middle School',
                             'Middle School'], 
                   'district':['Main District',
                               'Unknown District',
                               'Unknown District',
                               'Some other District']
})

enter image description here

比起pandas.DataFrame.duplicated()pandas.groupby()的组合来说,更是如此。

df[df.duplicated('school', keep=False)].groupby('school')
                                       .apply(lambda x: ', '.join(x['district']))
                                       .to_frame('duplicated names by district')

这将返回一个如下所示的DataFrame:

enter image description here

答案 2 :(得分:0)

仅根据列 school_name

获取所有重复的行:
df[df['school_name'].duplicated(keep=False)]

如果要获取单个 school_name 值的行:

# If we are searching for school let's say 'S1'
name = "S1"
df.loc[df['school_name'] == name]

要选择基于给定列表具有相同 school_name 的行,请使用isin

dupl_list = ['S1', 'S2', 'S3']
df.loc[df['school_name'].isin(dupl_list)]