【问题标题】:New column from previous columns in PandasPandas 之前专栏的新专栏
【发布时间】:2025-12-16 08:15:01
【问题描述】:

我有一个带有一些列的 pandas 数据框:

>>data.columns.values
array(['Sheet', 'Row', 'Column', 'Cell', 'V0', 'Thx', 'dV', 'Vd'], dtype=object)

每一行包含不同的工作表、行等值。

根据 Sheet、Row 等信息,我将创建一个 PDF 文件标题,如下所示:

title = Sheet%s_Row%s_Column%s_Cell%s.pdf

因此,我不想遍历 DataFrame 的每一行并每次创建一个标题,而是直接创建另一列名为 title 的字符串并存储不同的标题,如下所示:

data['title'] = "Sheet%s_Row%s_Column%s_Cell%s" % (data['Sheet'], data['Row'], data['Column'], data['Cell'])

但这不起作用,似乎它在每个 %s 中附加了每个 Serie

如何根据每一行的信息创建 title 列,而不必遍历整个 DataFrame?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    一种方法是使用DataFrame.apply()axis=1。示例 -

    data['title'] = data.apply(lambda row: "Sheet{}_Row{}_Column{}_Cell{}".format(row['Sheet'], row['Row'], row['Column'], row['Cell']) , axis=1)
    

    演示 -

    In [52]: df = pd.DataFrame([['A','B'],['C','D'],['E','F']] , columns=['Sheet','row'])
    
    In [53]: df
    Out[53]:
      Sheet row
    0     A   B
    1     C   D
    2     E   F
    
    In [54]: df['title'] = df.apply(lambda row: "Sheet{}_row{}".format(row['Sheet'],row['row']) , axis=1)
    
    In [55]: df
    Out[55]:
      Sheet row        title
    0     A   B  SheetA_rowB
    1     C   D  SheetC_rowD
    2     E   F  SheetE_rowF
    

    【讨论】:

    • 感谢 Anand,但是,在我的 for 循环解决方案中,我也使用了这个 row['Sheet'] 等,所以我问:这个 lambda 函数是否也在迭代整个 DataFrame?谢谢!
    • 是的,它正在遍历整个 DataFrame。只是迭代是 pandas 内部的。
    • 好的,所以我认为它可能比我的解决方案更快for index, row in data.iterrows() .......
    • 取决于你用 for 循环做什么。要根据需要创建一个全新的列,我认为没有任何矢量化方法(尽管我可能是错的)。
    【解决方案2】:

    这是另一种方法,您可以提前指定要操作的列:

    var = ['Sheet','row']
    
    df['title'] = reduce(lambda x,y: x+'_'+y, [v + df[v] for v in var])
    
    Out[284]:
      Sheet row        title
    0     A   B  SheetA_rowB
    1     C   D  SheetC_rowD
    2     E   F  SheetE_rowF
    

    【讨论】: