Python 使用Numpy在数据帧上应用权重公式
我有一个数据帧,希望将单元格的浮点值除以它所在行的总和。为此,我使用了numpy公式。因此,这将为该行的该单元格提供权重。我有这个数据帧Python 使用Numpy在数据帧上应用权重公式,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有一个数据帧,希望将单元格的浮点值除以它所在行的总和。为此,我使用了numpy公式。因此,这将为该行的该单元格提供权重。我有这个数据帧df1: AA-AB-AC-AD 2005-01-02 23:55:00“权益” 2005-01-03 00:00:00 32.32 19.5299 32.32 31.0455 2005-01-04 00:00:00 31.9075 19.4487 31.9075 30
df1
:
AA-AB-AC-AD
2005-01-02 23:55:00“权益”
2005-01-03 00:00:00 32.32 19.5299 32.32 31.0455
2005-01-04 00:00:00 31.9075 19.4487 31.9075 30.3755
2005-01-05 00:00:00 31.6151 19.5799 31.6151 29.971
2005-01-06 00:00:00 31.1426 19.7174 31.1426 29.9647
到目前为止,我已经尝试了以下方法:
import numpy as np
def foo_bar(x):
if type(x) is not str:
return x / np.sum(df1, axis=1)
else:
return
df = df_numeric.apply(np.vectorize(foo_bar))
由于出现以下错误,我的公式的求和部分似乎写得不正确:
AA-AB-AC-AD
ValueError:(“使用序列设置数组元素”。,“在索引AA处发生”)
在这种情况下,消息错误提供了大量信息:您正在尝试使用序列设置数组元素(x)。
尝试在Python提示符中加载数据帧df1
,并打印表达式np.sum(df1,axis=1)
:它返回一个序列-一个向量-包含每行的和。在每种情况下,您都需要选择该序列中对应于适当行的元素
如前所述,您可以尝试以下操作:
df1.div(df1.sum(轴=1,轴=0)
div
将在数据帧中应用元素分割
从您的
df1
代码片段中,似乎有带字符串的行(“EQUITY”
)与带数字的行交替出现,这会给您带来问题。我建议您去掉任何字符串行,只留下一个带有数字的数据帧。您可以使用列标题为数据框中的列指定有效名称。在这种情况下,消息错误提供了大量信息:您正在尝试使用序列设置数组元素(x)。
尝试在Python提示符中加载数据帧df1
,并打印表达式np.sum(df1,axis=1)
:它返回一个序列-一个向量-包含每行的和。在每种情况下,您都需要选择该序列中对应于适当行的元素
如前所述,您可以尝试以下操作:
df1.div(df1.sum(轴=1,轴=0)
div
将在数据帧中应用元素分割
从您的
df1
代码片段中,似乎有带字符串的行(“EQUITY”
)与带数字的行交替出现,这会给您带来问题。我建议您去掉任何字符串行,只留下一个带有数字的数据帧。您可以使用列标题为数据框中的列指定重要名称。请尝试以下代码,该代码使用pandas功能,而不是显式函数
该函数执行按元素的除法。将总和作为一个系列输入该函数,并使用原始元素的行索引选择适当的除法值
import numpy as np
import pandas as pd
data = pd.DataFrame(np.arange(12).reshape((3, 4)),columns=['A', 'B', 'C', 'D'])
data['Total'] = data.sum(axis=1)
data_new= data.iloc[:, :-1].div(data["Total"], axis=0)
print data
print data_new
结果:
A B C D Total
0 0 1 2 3 6
1 4 5 6 7 22
2 8 9 10 11 38
A B C D
0 0.000000 0.166667 0.333333 0.500000
1 0.181818 0.227273 0.272727 0.318182
2 0.210526 0.236842 0.263158 0.289474
尝试下面的代码,它使用pandas特性而不是显式函数 该函数执行按元素的除法。将总和作为一个系列输入该函数,并使用原始元素的行索引选择适当的除法值
import numpy as np
import pandas as pd
data = pd.DataFrame(np.arange(12).reshape((3, 4)),columns=['A', 'B', 'C', 'D'])
data['Total'] = data.sum(axis=1)
data_new= data.iloc[:, :-1].div(data["Total"], axis=0)
print data
print data_new
结果:
A B C D Total
0 0 1 2 3 6
1 4 5 6 7 22
2 8 9 10 11 38
A B C D
0 0.000000 0.166667 0.333333 0.500000
1 0.181818 0.227273 0.272727 0.318182
2 0.210526 0.236842 0.263158 0.289474