【问题标题】:Apply a weight formula over a Dataframe using Numpy使用 Numpy 在 Dataframe 上应用权重公式
【发布时间】:2017-01-25 21:40:14
【问题描述】:

我有一个数据框,我希望将单元格的浮点值除以它所在行的总和。为此,我使用了一个 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')

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    在这种情况下,消息错误信息非常丰富:您正在尝试使用序列设置数组元素 (x)。

    尝试在 Python 提示符中加载您的数据框 df1 并打印表达式 np.sum(df1,axis=1):它返回一个序列 - 一个向量 - 包含每行的总和。您需要选择此序列中与每种情况下的相应行相对应的元素。

    您可以尝试以下方法,如here 所述:

    df1.div(df1.sum(axis=1), axis=0)

    div 将在您的数据框中应用元素划分。

    从您的df1 sn-p 看来,您有带字符串的行 ("EQUITY") 与带数字的行交替出现,这会给您带来问题。我建议你取出任何字符串行,只留下一个带有数字的数据框。您可以使用列标题为数据框中的列赋予重要的名称。

    【讨论】:

      【解决方案2】:

      试试下面这段代码,它使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多