使用Numpy在Dataframe上应用权重公式

时间:2016-09-17 22:07:05

标签: python pandas numpy dataframe

我有一个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')

2 个答案:

答案 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