我正在尝试将DataFrame中的列与子字符串列表之一匹配。
例如取具有以下值的列(strings
):
text1C1
text2A
text2
text4
text4B
text4A3
并创建一个新列,将其与以下子字符串进行匹配:
vals = ['text1', 'text2', 'text3', 'text4', 'text4B']
我目前拥有的代码可以正常工作,但似乎是解决问题的一种非常低效的方式。
df = pd.DataFrame({'strings': ['text1C1', 'text2A', 'text2', 'text4', 'text4B', 'text4A3']})
for v in vals:
df.loc[df[df['strings'].str.contains(v)].index, 'matched strings'] = v
这将返回以下我需要的DataFrame。
strings matched strings
0 text1C1 text1
1 text2A text2
2 text2 text2
3 text4 text4
4 text4B text4B
5 text4A3 text4
是否有更有效的方法来做到这一点,特别是对于较大的DataFrame(10k +行)?
我想不出如何处理vals
中的一个项目,而该项目又是另一个项目的子串(text4
是text4B
的子串)
答案 0 :(得分:2)
使用带有//code in the parent
static navigationOptions = {
headerTitle: <MyCustomHeader/>, //my custom header component
headerStyle: { //applies to the View
backgroundColor: colors.darkThemeBackground,
},
headerTintColor: colors.whiteText,
};
的生成器来匹配第一个值:
next
更通用的解决方案(如果可能)没有与s = vals[::-1]
df['matched strings1'] = df['strings'].apply(lambda x: next(y for y in s if y in x))
print (df)
strings matched strings matched strings1
0 text1C1 text1 text1
1 text2A text2 text2
2 text2 text2 text2
3 text4 text4 text4
4 text4B text4B text4B
5 text4A3 text4 text4
和默认参数iter
匹配的值:
next
您的解决方案应得到改善:
f = lambda x: next(iter(y for y in s if y in x), 'no match')
df['matched strings1'] = df['strings'].apply(f)