Python 如何在检查列表中的拆分文本成员资格后从dataframe中删除行?
这是我拥有的数据帧的头部:Python 如何在检查列表中的拆分文本成员资格后从dataframe中删除行?,python,python-3.x,pandas,Python,Python 3.x,Pandas,这是我拥有的数据帧的头部: london.head() Location Borough Post town 0 Abbey Wood Bexley, Greenwich LONDON 1 Acton Ealing, Hammersmith and Fulham LONDON 2 Addington Croydon CROYD
london.head()
Location Borough Post town
0 Abbey Wood Bexley, Greenwich LONDON
1 Acton Ealing, Hammersmith and Fulham LONDON
2 Addington Croydon CROYDON
3 Addiscombe Croydon CROYDON
4 Albany Park Bexley BEXLEY, SIDCUP
这是从维基百科上摘取的伦敦地区列表:
行政区以逗号分隔,有些地点位于两个行政区内
我有一个东伦敦的行政区列表,我想用它来过滤数据帧
east_lon = ['Tower Hamlets', 'Newham', 'Waltham Forest', 'Barking and Dagenham', 'Redbridge', 'Havering', 'Hackney']
我尝试使用这个嵌套for循环来检查列表中单个自治区或被拆分后的一个自治区的成员资格
for index, row in london.iterrows():
for borough in row['Borough'].split():
if borough or (borough + ',') not in east_lon:
london.drop(index, inplace=True)
我收到的错误是
在axis中找不到[0]
我做错了什么?有没有更合适的方法来写这篇文章?的想法是将数值按集合进行比较,最后用于反转掩模使用
~
:
east_lon = ['Bexley', 'Ealing', 'Waltham Forest']
s = set(east_lon)
mask = df['Borough'].apply(lambda x: set(x.split(', ')).isdisjoint(s))
df = df[~mask]
print (df)
Location Borough Post town
0 Abbey Wood Bexley, Greenwich LONDON
1 Acton Ealing, Hammersmith and Fulham LONDON
4 Albany Park Bexley BEXLEY, SIDCUP
也许这会有帮助
london = london[london['Borough'].str.contains('|'.join(east_lon))]
使用
isin
和any
m=pd.DataFrame(df['Borough'].str.split(', ').tolist(),index=df.index).isin(east_lon).any(axis=1)
df=df[m].copy()
在这里,我建议在解决方案正常工作时添加一些注释-测试值不按
,
拆分,而是按所有值拆分。因此,如果east_lon=['aaa','bbb']
它也会为列-london['Borough']=['aaa ddd,sss','bbb']
中的此样本数据返回True
,但只返回aaa
。取决于OP是否需要按,
拆分的测试值。True。我只是假设自治区是唯一的,没有公共子字符串。谢谢你提到.golfeddf.Borough.str.split(',').map({*east_lon}.isdisjoint)
我喜欢使用isdisjoint
非常聪明。很棒的东西。他很有魅力