如何高效从Pandas列表列生成连续元素对新列?
问题描述
我有一个包含如下数据的Pandas DataFrame:
d = {'id': [1, 2, 3, 4, 5], 'value': [['Red', 'Blue', 'Yellow'], ['Blue', 'Yellow', 'Orange'], ['Green', 'Purple', 'Yellow', 'Red'], ['Violet', 'Blue', 'Green', 'Red', 'Brown'], ['Blue', 'Green']]} df = pd.DataFrame(data = d)
希望将value列中的字符串列表拆分为连续的两两组合,生成如下形式的新DataFrame:
d = {'value': [['Red', 'Blue'], ['Blue', 'Yellow'], ['Blue', 'Yellow'], ['Yellow', 'Orange'], ['Green', 'Purple'], ['Purple', 'Yellow'], ['Yellow', 'Red'], ['Violet', 'Blue'], ['Blue', 'Green'], ['Green', 'Red'], ['Red', 'Brown'], ['Blue', 'Green']]} df = pd.DataFrame(data = d)
我尝试用apply(lambda x:)方法实现,但该方法仅返回每个列表的第一对元素:
def splitter(row): for first, second in zip(row, row[1:]): return [first, second] pairs_list = df.value.apply(lambda x: splitter(x))
我知道可以用iterrows()循环实现,但想了解更高效的方法。
高效实现方案
方案1:修改apply逻辑+explode展开
你的问题出在splitter函数里的return语句——每次循环到第一对就直接返回了,所以只得到第一个组合。修改函数让它返回当前列表的所有连续对,再用explode把列表拆成单行即可:
def splitter(row): # 用列表推导式生成所有连续两两组合 return [[first, second] for first, second in zip(row, row[1:])] # 生成包含所有组合的列表列,再展开为单行 result_df = df['value'].apply(splitter).explode().to_frame(name='value')
这种方法比iterrows()高效,因为apply结合列表推导式是批量处理逻辑,explode是Pandas内置的高效展开方法,避免了逐行循环的开销。
方案2:全向量化操作(适合大型数据集)
如果你的数据集规模较大,推荐用完全向量化的方式,彻底避开apply:
# 先把每个列表拆成单行,保留原始id的关联 exploded = df.explode('value').reset_index(drop=True) # 生成每个元素和下一个元素的配对 pairs = pd.concat([exploded['value'], exploded['value'].shift(-1)], axis=1) # 过滤掉每个原始列表的最后一行(因为没有下一个元素) group_ids = df['id'].repeat(df['value'].str.len()) last_rows = exploded.groupby(group_ids).tail(1).index pairs = pairs.drop(last_rows) # 把两列合并为列表格式 result_df = pairs.apply(list, axis=1).to_frame(name='value')
这种方法利用Pandas的向量化API处理,在数据量较大时性能优势明显。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

