我有一个Dataframe,我希望将单元格的浮点值除以它所在行的总和。为此我使用了一个numpy公式。因此,这将给我该行的那个单元格的权重。我有这个数据框df1
:
AA AB AC AD
2005-01-02 23:55:00 "EQUITY" "EQUITY" "EQUITY" "EQUITY"
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: ('setting an array element with a sequence.', 'occurred at index AA')
答案 0 :(得分:4)
在这种情况下,消息错误非常有用:您正尝试使用序列设置数组元素( x )。
尝试在Python提示符中加载数据框df1
并打印表达式np.sum(df1,axis=1)
:它返回一个序列-a vector-包含每行的总和。您需要在每种情况下选择此序列的元素,该元素对应于相应的行。
您可以尝试以下,如here所述:
df1.div(df1.sum(axis=1), axis=0)
div
将在您的数据框中应用元素分割。
在您的df1
代码段中,似乎您的字符串("EQUITY"
)与带有数字的行交替显示,这些会给您带来问题。我建议你取出任何字符串行,只留下带数字的数据帧。您可以使用列标题为数据框中的列指定重要名称。
答案 1 :(得分:1)
尝试以下代码,它使用pandas功能而不是显式功能。
函数div执行元素分割。您将总和作为一系列函数提供给该函数,并使用原始元素的行索引选择适当的除法值。
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