【问题标题】:Apply weight formula over rows of Dataframe Pandas在 Dataframe Pandas 行上应用权重公式
【发布时间】:2016-09-15 19:44:23
【问题描述】:

我在下面有一个df1。我将它复制到df2 以保存df1;然后我使用df3 计算df2

df2=df1.copy()

我想计算诸如Weight(A) = Price(A) / Sum(row_Prices) 之类的权重并将其返回到价格下方的df2,例如对于每一行我得到3 行数据,即价格、标准和权重行。我还想计算该行的标准差,我想它是类似的形式。

我试过了

df3 = df2.iloc[1:,1:].div(df2.iloc[1:,1:].sum(axis=1), axis=0)

获取权重然后打印df3,但它不起作用。

为了为每个日期获取 2 行,我尝试堆叠 .stack(),但我可能做错了。帮助!谢谢

                       A      B      C        D     E
2006-04-27 00:00:00                                    
2006-04-28 00:00:00  69.62  69.62  6.518   65.09  69.62
2006-05-01 00:00:00   71.5   71.5  6.522   65.16   71.5
2006-05-02 00:00:00  72.34  72.34  6.669   66.55  72.34
2006-05-03 00:00:00  70.22  70.22  6.662   66.46  70.22
2006-05-04 00:00:00  68.32  68.32  6.758   67.48  68.32
2006-05-05 00:00:00     68     68  6.805   67.99     68
2006-05-08 00:00:00  67.88  67.88  6.768   67.56  67.88

我希望它能很好地输出:

                            A      B      C        D     E
2006-04-27 00:00:00

2006-04-28 00:00:00                                    
            price        69.62  69.62  6.518   65.09  69.62
            weight
            std
2006-05-01 00:00:00  
            price         71.5   71.5  6.522   65.16   71.5
            weight
            std
2006-05-02 00:00:00   
            price        72.34  72.34  6.669   66.55  72.34
            weight
            std

【问题讨论】:

  • 是的,这只是一个错字……我确实得到了 df1 的副本。还是谢谢
  • 你是怎么得到df1的?你的索引名称:2006-04-27 23:55:00 看起来很奇怪...你能发布print(df2)print(df2.index) 的输出吗
  • 是的,我只是修改了索引,在顶部添加了一行带有另一组值的行,但对于我认为的问题来说,这里并不那么相关。但是,我将其更改为表格以避免混淆。谢谢
  • 发布与 pandas 相关的问题时,请始终尝试使您的 DataFrame 易于重构。否则愿意回答你问题的人不得不浪费时间解析字符串,这不是很有趣。
  • @GustavoBezerra 谢谢!

标签: python pandas dataframe apply


【解决方案1】:

据我所知,没有一种快速而简单的方法可以实现您想要做的事情。 您需要计算所有数据,然后将其全部合并到使用多级索引的DataFrame

# Making weight/std DataFrames
cols = list('ABCDE')
weight = pd.DataFrame([df[col] / df.sum(axis=1) for col in df], index=cols).T
std = pd.DataFrame([df.std(axis=1) for col in df], index=cols).T

# Making MultiIndex DataFrame
mindex = pd.MultiIndex.from_product([['price', 'weight', 'std'], df.index])
new_df = pd.DataFrame(index=mindex, columns=cols)

# Inserting data
new_df.ix['price'] = df.values
new_df.ix['weight'] = weight.values
new_df.ix['std'] = std.values

# Swapping levels
new_df = new_df.swaplevel(0, 1).sort_index()

生成的new_df 应该看起来像这样:

2006-04-28 price      69.62     69.62      6.518     65.09     69.62
           std      27.7829   27.7829    27.7829   27.7829   27.7829
           weight  0.248228  0.248228  0.0232397  0.232076  0.248228
2006-05-01 price       71.5      71.5      6.522     65.16      71.5
           std      28.4828   28.4828    28.4828   28.4828   28.4828
           weight  0.249841  0.249841  0.0227897  0.227687  0.249841
2006-05-02 price      72.34     72.34      6.669     66.55     72.34
           std      28.8308   28.8308    28.8308   28.8308   28.8308
           weight  0.249243  0.249243  0.0229776  0.229294  0.249243
2006-05-03 price      70.22     70.22      6.662     66.46     70.22
           std      28.0509   28.0509    28.0509   28.0509   28.0509
           weight  0.247443  0.247443  0.0234758  0.234194  0.247443
2006-05-04 price      68.32     68.32      6.758     67.48     68.32
           std      27.4399   27.4399    27.4399   27.4399   27.4399
           weight  0.244701  0.244701   0.024205  0.241692  0.244701
2006-05-05 price         68        68      6.805     67.99        68
           std      27.3661   27.3661    27.3661   27.3661   27.3661
           weight  0.243907  0.243907  0.0244086  0.243871  0.243907
2006-05-08 price      67.88     67.88      6.768     67.56     67.88
           std      27.2947   27.2947    27.2947   27.2947   27.2947
           weight  0.244201  0.244201  0.0243481   0.24305  0.244201

作为旁注,我不确定您要计算哪种标准,所以我只是假设它是按行价格标准(每行将是单个/重复值)。

【讨论】:

  • 一个问题实际上是我在索引 2006-04-27 00:00:00 的第一行中有一个类型字符串作为值,因此 weight 和 std 函数在他们尝试时不起作用比较字符串和浮点数.. 你知道如何过滤只存在 int 或浮点数的行吗?
  • 对于权重公式,我得到这个:TypeError: Cannot compare type 'Timestamp' with type 'str'
  • 确保所有索引都由Timestamp 类型组成。将pd.to_datetime 应用于索引就足够了。
猜你喜欢
  • 2017-01-25
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2019-12-25
  • 2022-11-28
  • 2017-11-14
  • 2016-06-15
  • 2018-12-25
相关资源
最近更新 更多