如何 select 列值中的特定字符串并将其分配给 pandas 中的新列
how to select a particular string from a column value and assign it to a new column in pandas
文档 = [文档 1、文档 2、文档 3]
护士 = [nur1, nur2, nur3]
1st responder
Associates
doc1
nur1, nur2
nur1
doc1, nur2
nur3
nur1, nur2, doc2
doc2
nur2, nur1
我想添加一个新列 'Doctor' 和 select 来自“第一响应者”或 'Associates' 的医生,这样得到的 df 就像:
1st responder
Associates
Doctor
doc1
nur1, nur2
doc1
nur1
doc1, nur2
doc1
nur3
nur1, nur2, doc2
doc2
doc2
nur2, nur1
doc2
我应该使用 apply/map 还是有矢量化方法?
您可以使用:
docs = ['doc1', 'doc2', 'doc3']
df['Doctor'] = df.assign(Associates=df['Associates'].str.split(', ')) \
.melt(ignore_index=False).explode('value') \
.query('value.isin(@docs)').groupby(level=0)['value'].first()
输出:
1st responder
Associates
Doctor
doc1
nur1, nur2
doc1
nur1
doc1, nur2
doc1
nur3
nur1, nur2, doc2
doc2
doc2
nur2, nur1
doc2
保留行 where
第一响应者 isin
列表 docs
并在第二列中用 str.extract
填充缺失值。所以
df['Doctor'] = (
df['1st responder']
.where(lambda x: x.isin(docs),
other = df['Associates'].str.extract(pat='('+'|'.join(docs)+')')[0])
)
print(df)
# 1st responder Associates Doctor
# 0 doc1 nur1, nur2 doc1
# 1 nur1 doc1, nur2 doc1
# 2 nur2 nur3, nur4, doc2 doc2
# 3 doc2 nur4 doc2
使用的输入
df = pd.DataFrame({
'1st responder': ['doc1','nur1','nur2','doc2'],
'Associates' : ['nur1, nur2', 'doc1, nur2', 'nur3, nur4, doc2', 'nur4']
})
docs = ['doc1','doc2', 'doc3']
文档 = [文档 1、文档 2、文档 3]
护士 = [nur1, nur2, nur3]
1st responder | Associates |
---|---|
doc1 | nur1, nur2 |
nur1 | doc1, nur2 |
nur3 | nur1, nur2, doc2 |
doc2 | nur2, nur1 |
我想添加一个新列 'Doctor' 和 select 来自“第一响应者”或 'Associates' 的医生,这样得到的 df 就像:
1st responder | Associates | Doctor |
---|---|---|
doc1 | nur1, nur2 | doc1 |
nur1 | doc1, nur2 | doc1 |
nur3 | nur1, nur2, doc2 | doc2 |
doc2 | nur2, nur1 | doc2 |
我应该使用 apply/map 还是有矢量化方法?
您可以使用:
docs = ['doc1', 'doc2', 'doc3']
df['Doctor'] = df.assign(Associates=df['Associates'].str.split(', ')) \
.melt(ignore_index=False).explode('value') \
.query('value.isin(@docs)').groupby(level=0)['value'].first()
输出:
1st responder | Associates | Doctor |
---|---|---|
doc1 | nur1, nur2 | doc1 |
nur1 | doc1, nur2 | doc1 |
nur3 | nur1, nur2, doc2 | doc2 |
doc2 | nur2, nur1 | doc2 |
保留行 where
第一响应者 isin
列表 docs
并在第二列中用 str.extract
填充缺失值。所以
df['Doctor'] = (
df['1st responder']
.where(lambda x: x.isin(docs),
other = df['Associates'].str.extract(pat='('+'|'.join(docs)+')')[0])
)
print(df)
# 1st responder Associates Doctor
# 0 doc1 nur1, nur2 doc1
# 1 nur1 doc1, nur2 doc1
# 2 nur2 nur3, nur4, doc2 doc2
# 3 doc2 nur4 doc2
使用的输入
df = pd.DataFrame({
'1st responder': ['doc1','nur1','nur2','doc2'],
'Associates' : ['nur1, nur2', 'doc1, nur2', 'nur3, nur4, doc2', 'nur4']
})
docs = ['doc1','doc2', 'doc3']