用DataFrame列

时间:2019-05-10 10:32:07

标签: python pandas

我正在尝试将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中的一个项目,而该项目又是另一个项目的子串(text4text4B的子串)

1 个答案:

答案 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)