如何基于子串及后续文本在Pandas DataFrame中创建新列?
解决方案
步骤1:构造示例DataFrame
import pandas as pd data = { 'A': ['Jan05 GN=XYZ NA', 'Dec25 GN=ZYX Y', 'Nov12 GN=NHAN Y', 'May22 GN=GZV X', 'Jun24 MNIAV X', 'May22 CAUCGZV Y'], 'B': ['Q9GLD3;A0A0A0RBT6', 'A0A8I3PIE0;A0A8I3PEP4;A0A0B4J198', 'P60524;A0A1K0GGH0;A0A8I3P9B9', 'P09582;A0A1R3UGQ4;A0A8I3NWV7', 'P09582;A0A1R3UGQ4;A0A8I3NWV7', 'P09582;A0A1R3UGQ4;A0A8I3NWV7'] } df = pd.DataFrame(data)
步骤2:创建新列C
用numpy.where结合字符串处理实现,这种方法比apply更高效,适合大数据集:
import numpy as np # 提取A列中GN=后的非空白内容 gn_extract = df['A'].str.extract(r'GN=(\S+)', expand=False) # 提取B列第一个分号前的内容 b_extract = df['B'].str.split(';').str[0] # 按条件赋值生成新列C df['C'] = np.where(df['A'].str.contains('GN='), gn_extract, b_extract)
验证结果
运行后查看DataFrame:
print(df)
输出结果与需求一致:
| A | B | C |
|---|---|---|
| Jan05 GN=XYZ NA | Q9GLD3;A0A0A0RBT6 | XYZ |
| Dec25 GN=ZYX Y | A0A8I3PIE0;A0A8I3PEP4;A0A0B4J198 | ZYX |
| Nov12 GN=NHAN Y | P60524;A0A1K0GGH0;A0A8I3P9B9 | NHAN |
| May22 GN=GZV X | P09582;A0A1R3UGQ4;A0A8I3NWV7 | GZV |
| Jun24 MNIAV X | P09582;A0A1R3UGQ4;A0A8I3NWV7 | P09582 |
| May22 CAUCGZV Y | P09582;A0A1R3UGQ4;A0A8I3NWV7 | P09582 |
代码解释
df['A'].str.extract(r'GN=(\S+)', expand=False):通过正则表达式匹配GN=后的所有非空白字符,精准提取目标字符串。df['B'].str.split(';').str[0]:将B列内容按分号分割,取分割后的第一个元素,即分号前的内容。np.where(condition, x, y):当条件(A列含"GN=")成立时取gn_extract的值,否则取b_extract的值,直接实现需求中的逻辑判断。
内容的提问来源于stack exchange,提问作者Sterling Wright
相关产品推荐
相关产品推荐

