如何在Pandas DataFrame中生成包含前缀匹配ID列表的新列
解决方案:为DataFrame添加包含匹配字符串的ID列表列
首先,针对你提出的需求——给现有DataFrame新增一列,每一行的值是所有其他行的string_value完全包含当前行string_value的ID组成的列表,这里有一个基于pandas的简洁实现方案:
示例数据准备
先还原你提供的原始DataFrame:
import pandas as pd data = { 'id': [1, 2, 3, 4, 5, 6], 'string_value': [ 'The quick brown fox', 'The quick brown fox jumps', 'The quick brown fox jumps over', 'The quick brown fox jumps over the lazy dog', 'The slow', 'The slow brown fox' ] } df = pd.DataFrame(data)
实现代码
我们可以通过apply方法结合自定义函数来完成需求:
def get_matching_ids(row, full_df): # 筛选条件:其他行的string_value包含当前行的字符串,且排除当前行自身 matching_rows = full_df[ (full_df['string_value'].str.contains(row['string_value'])) & (full_df['id'] != row['id']) ] # 返回匹配到的ID列表 return matching_rows['id'].tolist() # 逐行应用函数生成新列 df['new_columns'] = df.apply(lambda x: get_matching_ids(x, df), axis=1)
运行结果
执行完上述代码后,你的DataFrame就会变成期望的样子:
| id | string_value | new_columns |
|---|---|---|
| 1 | The quick brown fox | [2, 3, 4] |
| 2 | The quick brown fox jumps | [3, 4] |
| 3 | The quick brown fox jumps over | [4] |
| 4 | The quick brown fox jumps over the lazy dog | [] |
| 5 | The slow | [6] |
| 6 | The slow brown fox | [] |
补充说明
- 如果需要忽略大小写匹配,可以在
str.contains里加上case=False参数,比如full_df['string_value'].str.contains(row['string_value'], case=False) - 这个方案的时间复杂度是O(n²),如果你的DataFrame行数非常多(比如上万行),可能需要优化,但对于中小规模的数据完全够用。
内容的提问来源于stack exchange,提问作者Nadiia
相关产品推荐
相关产品推荐

