首页 > 解决方案 > 向量化添加多个 pandas 列

问题描述

我有一个示例数据框:

   val1  val2  val3  val4  total
0     1     2     3     4     50
1     5     6     4     8     65
2     2     3     6     5     74

我想根据列的简单添加和划分创建一些新列。我每次都会得到一个比例/比率,所以我设置了一个快速函数来做到这一点:

def vectorize(df,value_cols,total_col):

    return df[value_cols] / df[total_col]

现在我想得到相对于 的val1比例total

total = 'total'
values = 'val1'

df['result'] = vectorize(df,values,total)

   val1  val2  val3  val4  total    result
0     1     2     3     4     50  0.020000
1     5     6     4     8     65  0.076923
2     2     3     6     5     74  0.027027

看起来很棒。

现在,当我想在除以之前添加多列时total,我遇到了问题。

例如,我试图找到与val1 + val2相关的比例total

total = 'total'
values = ['val1','val2']

df['result2'] = vectorize(df,values,total)

ValueError: Wrong number of items passed 5, placement implies 1

这不起作用,因为我的列名现在在列表中。它返回一个数据框Nans

有没有简单的方法解决这个问题?

我尝试添加sum()到函数中,但没有得到正确的结果:

return df[value_cols].sum() / df[total_col]

我尝试enumerate在除以之前使用将列添加在一起total

for i,col in enumerate(value_cols):

    sums = df[col] += df[col]

    return sums / df[total_col]

但这些都不起作用。

我基本上是在尝试在函数中自动执行此操作:

df['val1'] + df['val2'] / df['total'] 

但也允许单列,即val1单独列。

我的真实世界数据框有数百列,我想像这样添加一个或多个列。我可以手动输入,但我想尝试通过创建矢量化函数来加快速度。

我的可再现性df:

import pandas as pd

pd.DataFrame({'val1': pd.Series([1, 5, 2],dtype='int64',index=pd.RangeIndex(start=0, stop=3, step=1)), 'val2': pd.Series([2, 6, 3],dtype='int64',index=pd.RangeIndex(start=0, stop=3, step=1)), 'val3': pd.Series([3, 4, 6],dtype='int64',index=pd.RangeIndex(start=0, stop=3, step=1)), 'val4': pd.Series([4, 8, 5],dtype='int64',index=pd.RangeIndex(start=0, stop=3, step=1)), 'total': pd.Series([50, 65, 74],dtype='int64',index=pd.RangeIndex(start=0, stop=3, step=1))}, index=pd.RangeIndex(start=0, stop=3, step=1))

标签: pythonpandas

解决方案


只需调整您的功能:

def vectorize(df,value_cols,total_col):
    if(isinstance(value_cols, list)):
        return df[value_cols].apply(sum, axis=1).div(df[total_col])
    else:
        return df[value_cols].div(df[total_col])

输出:

   val1  val2  val3  val4  total    result   result2
0     1     2     3     4     50  0.020000  0.060000
1     5     6     4     8     65  0.076923  0.169231
2     2     3     6     5     74  0.027027  0.067568

推荐阅读