有没有办法在熊猫数据框中选择“相似”(不重复!)的行?
我有一个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”中没有相似发音的名称,(因为如果学校实际上位于一个完全不同的地区)。
答案 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']
})
比起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:
答案 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)]