如何在Pandas中为DataFrame列内列表的每个元素追加对应列字符串?
如何向量化实现DataFrame列表列元素追加对应字符串
嘿,我懂你想避开低效的循环,用更优雅的向量化方式搞定这个需求——把df['a']里的字符串追加到df['c']每个列表元素的末尾对吧?你之前试的cat方法路子不对,因为cat是用来处理字符串Series拼接的,没法直接操作列表里的元素。给你两个靠谱的解决方案:
首先先还原你的示例DataFrame,方便演示:
import pandas as pd df = pd.DataFrame({ 'a': ['d', 'f', 'g'], 'b': [1, 2, 3], 'c': [['f', 'h'], ['u', 'v'], ['i', 'o']] })
方案1:简洁高效的apply写法
这个写法比手动写for循环优雅得多,而且pandas的apply内部做了优化,效率不错:
df['d'] = df.apply(lambda row: [s + row['a'] for s in row['c']], axis=1)
它的逻辑很直接:按行遍历DataFrame,每一行里把c列的每个字符串和a列的字符串拼接,生成新列表后赋值给d列。
方案2:纯向量化的explode+groupby方案
如果你的数据量很大,这个纯向量化的方法效率会更高,完全避开行级操作:
# 第一步:把c列的列表展开成单行对应一个元素 exploded_df = df.explode('c') # 第二步:给每个展开后的字符串拼接a列的对应值 exploded_df['d'] = exploded_df['c'] + exploded_df['a'] # 第三步:按原索引分组,把拼接后的字符串重新聚合成列表 df['d'] = exploded_df.groupby(exploded_df.index)['d'].agg(list)
两种方案运行后都能得到你想要的结果:
a b c d 0 d 1 ['f', 'h'] ['fd', 'hd'] 1 f 2 ['u', 'v'] ['uf', 'vf'] 2 g 3 ['i', 'o'] ['ig', 'og']
补充一句:你之前用的df['c'].cat(df['a'],axis=0)之所以不行,是因为df['c']是存储列表的Series,cat方法只能处理字符串类型的Series拼接,没法识别列表里的元素,所以才会失败~
内容的提问来源于stack exchange,提问作者anjali
相关产品推荐
相关产品推荐

