python - 向量化添加多个 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))
解决方案
只需调整您的功能:
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
推荐阅读
- postgresql - 使用 JPA 而不是本机查询在 postgres 中获取序列的下一个值
- audio - 使用 Sox 将多个 .raw 文件合并为单个 wav 文件
- jquery - 需要使用 jquery 从 Salesforce Lightning 中的文本框获取价值
- c# - SceneManager 无法识别 LoadSceneAsync
- angular - 角度拦截http错误
- java - Hazelcast上的DistributedTask,Hazelcast上需要的Task实现或者调用者可以实现
- java - 如何使用邮递员休息客户端将自定义 dto 作为休息 api 输入传递
- html - 文本与图像剪辑冲突
- ruby-on-rails - 数组属性的表单选择
- jquery - 在剑道网格中保留重复的行