如果某个字符串是另一列的子字符串,我想创建一个新列。假设我有一个带有一列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']
如何在循环浏览列表(实际上只比两个项目更大)或应用函数时完成此任务?
答案 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同时包含AA
和BB
怎么办?在这种情况下,我的代码可能需要根据您希望定义输出行为的方式进行一些修改。