微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果第二列与给定的列表pandas匹配,则替换dataframe列中的值

我有以下数据帧

      col1          col2
0     str9          val1
1     str8          val2
2     str4          val3
3     str2          val4
4  unkNown1    asdvstr1df
5  random1  teststr2test

和以下列表

strings = ['str1', 'str2', 'str3', 'str4']

如果第二列中字符串中任何一点与给定列表,字符串匹配,我想替换第1列中的值.

注意:col2可以在字符串中包含列表’string’的值,也可以在任一端.

目前我正在使用一个丑陋且缓慢的嵌套循环:

import pandas as pd

data_file = pd.DataFrame(data = ([['str9', 'val1'], ['str8',  'val2'], ['str4','val3'] , ['str2', 'val4'] , ['unkNown', 'asdvstr1df'] , ['unkNown', 'teststr2test']] ), columns = (['col1', 'col2']), dtype = str)
strings = ['str1', 'str2', 'str3', 'str4']

for value in range(data_file.shape[0]):
    for text in strings:
        if (str(data_file.col2[value]).find(text) != -1):
            data_file.loc[value, 'col1'] = text

我不确定如何改进这个缓慢的过程.如何让这个运行速度比当前的O(nm)时间快(n是data_file的大小,m是名为字符串的列表的大小)?

输出应该是:

   col1          col2
0  str9          val1
1  str8          val2
2  str4          val3
3  str2          val4
4  str1    asdvstr1df
5  str2  teststr2test

解决方法:

IIUC,

x = '(' + '|'.join(strings)+ ')'
df.assign(col1 = df.col2.str.extract(x, expand=False).combine_first(df.col1))

输出

   col1          col2
0  str9          val1
1  str8          val2
2  str4          val3
3  str2          val4
4  str1    asdvstr1df
5  str2  teststr2test

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐