pandas:找到部分字符串并在新列中使用它

时间:2016-05-28 23:09:46

标签: python loops pandas vectorization

如果某个字符串是另一列的子字符串,我想创建一个新列。假设我有一个带有一列df ['A']的数据框:

NSArray *typeArray = [self arrayFromIOSObjectArray:visitTypeIOSObjectArray];

和一个清单:

         A           
0    bbh AA chd     
1    d10 DKL BB
2    kj AAdbl 5
3    kBB d7d dl

现在我想创建列df ['B'],如果在df ['A']中找到它们,它将接管列表中的值:

check = ['AA', 'BB']

如何在循环浏览列表(实际上只比两个项目更大)或应用函数时完成此任务?

2 个答案:

答案 0 :(得分:1)

设置

import pandas as pd

text = """A
bbh AA chd
d10 DKL BB
kj AAdbl 5
kBB d7d dl"""

df = pd.read_csv(StringIO(text))

check = ['AA', 'BB']

print df

            A
0  bbh AA chd
1  d10 DKL BB
2  kj AAdbl 5
3  kBB d7d dl

解决方案

df_expanded = df.A.str.split(expand=True)

checked = pd.concat(
    [df_expanded.apply(lambda s: s.str.rfind(chk)) for chk in check],
    keys=check
)

where = (checked >= 0).any(axis=1).unstack(0)
where = where.mul(where.columns.to_series(), axis=1)

final = pd.Series()
where.replace('', np.nan, inplace=True)
for c in where.columns:
    final = final.combine_first(where.loc[:, c])

df['B'] = final

print df

            A   B
0  bbh AA chd  AA
1  d10 DKL BB  BB
2  kj AAdbl 5  AA
3  kBB d7d dl  BB

答案 1 :(得分:1)

尝试使用iterrows遍历行并检查行是否包含检查列表中的任何元素,然后将其放入新列中。

for idx, row in df.iterrows():
    for c in check:
        if c in row['A']:
            df.ix[idx, 'B'] = c

输出:

df
Out[16]: 
            A   B
0  bbh AA chd  AA
1  d10 DKL BB  BB
2  kj AAdbl 5  AA
3  kBB d7d dl  BB

只有一点点困惑:如果df同时包含AABB怎么办?在这种情况下,我的代码可能需要根据您希望定义输出行为的方式进行一些修改。