【问题标题】:Loop over columns循环列
【发布时间】:2017-12-13 15:10:25
【问题描述】:

我有以下数据框,首先为每个队列计算以下数学运算 year+n/year.value==2009,然后为每个队列执行平均值

df
             id                                                        
year       2009     2010     2011     2012     2013     2014     2015   
cohort                                                                  
2009.0  72092.0  60513.0  48797.0  40968.0  34919.0  30452.0  26961.0   
2010.0      NaN  73735.0  61899.0  50263.0  42184.0  36150.0  31516.0   
2011.0      NaN      NaN  76809.0  64093.0  51372.0  43277.0  36994.0   
2012.0      NaN      NaN      NaN  69776.0  57621.0  46453.0  39098.0   
2013.0      NaN      NaN      NaN      NaN  71613.0  58996.0  47657.0   
2014.0      NaN      NaN      NaN      NaN      NaN  65430.0  52540.0   
2015.0      NaN      NaN      NaN      NaN      NaN      NaN  67121.0   
2016.0      NaN      NaN      NaN      NaN      NaN      NaN      NaN   
2017.0      NaN      NaN      NaN      NaN      NaN      NaN      NaN  

我将展示我想要执行的数学运算,因为我的英语不好而且数学是一种通用语言:)

对于自 2009 年以来经过 1 年的时间:(n=1)

需要的第一个值 = ((60513.0/72092.0) + (61899.0/73735.0) + (64093.0+76809.0) + (57621.0/69776.0) + (58996.0+71613.0) + (52540.0/65430.0))/6

对于自 2009 年以来经过 2 年的时间:(n=2)

需要的第二个值 = ((48797.0/72092.0) + (50263.0/73735.0) + (51372.0/76809.0) + (46453.0/69776.0) + (47657.0/71613.0))/5

对于自 2009 年以来的任何 3 年过去:(n=3)(最后一个,我认为有了这个,我想要做的循环就会被理解)

需要第三个值 = ((40968.0/72092.0) + (42184.0/73735.0) + (43277.0/76809.0) + (39098.0/69776.0))/4

以此类推,直到最后一个值为

最后一个值 = 26961.0/72092.0

在此先感谢,对不起我的英语

我正在尝试这样的事情,也许它可以帮助

第一个值:

((df1.iloc[0,1]/df1.iloc[0,0]) + (df1.iloc[1,2]/df1.iloc[1,1]) + 
(df1.iloc[2,3]/df1.iloc[2,2]) + (df1.iloc[3,4]/df1.iloc[3,3]) + 
(df1.iloc[4,5]/df1.iloc[4,4]) + (df1.iloc[5,6]/df1.iloc[5,5]))/6

第二个值:

((df1.iloc[0,2]/df1.iloc[0,0]) + (df1.iloc[1,3]/df1.iloc[1,1]) + 
(df1.iloc[2,4]/df1.iloc[2,2]) + (df1.iloc[3,5]/df1.iloc[3,3]) + 
(df1.iloc[4,6]/df1.iloc[4,4]))/5

第三个值:

((df1.iloc[0,3]/df1.iloc[0,0]) + (df1.iloc[1,4]/df1.iloc[1,1]) + 
(df1.iloc[2,5]/df1.iloc[2,2]) + (df1.iloc[3,6]/df1.iloc[3,3]))/4

等等……

类似这样的东西,但有一个循环,这是我正在寻找的代码。

【问题讨论】:

  • 您能否打印df.to_dict() 并将其粘贴到您的问题中?否则,很难重现此数据帧。

标签: python python-3.x pandas numpy


【解决方案1】:

IIUC,我们需要将NaNs 移到他们行的底部。然后执行divmean

df=df.apply(lambda x: sorted(x, key=pd.isnull), 1)
df.iloc[:,1:].div(df.iloc[:,0],0).mean(0)
Out[36]: 
2010    0.827654
2011    0.671719
2012    0.566037
2013    0.485424
2014    0.424914
2015    0.373980

更多信息

df.apply(lambda x: sorted(x, key=pd.isnull), 1)
Out[37]: 
           2009     2010     2011     2012     2013     2014     2015
2009.0  72092.0  60513.0  48797.0  40968.0  34919.0  30452.0  26961.0
2010.0  73735.0  61899.0  50263.0  42184.0  36150.0  31516.0      NaN
2011.0  76809.0  64093.0  51372.0  43277.0  36994.0      NaN      NaN
2012.0  69776.0  57621.0  46453.0  39098.0      NaN      NaN      NaN
2013.0  71613.0  58996.0  47657.0      NaN      NaN      NaN      NaN
2014.0  65430.0  52540.0      NaN      NaN      NaN      NaN      NaN
2015.0  67121.0      NaN      NaN      NaN      NaN      NaN      NaN
2016.0      NaN      NaN      NaN      NaN      NaN      NaN      NaN
2017.0      NaN      NaN      NaN      NaN      NaN      NaN      NaN

【讨论】:

  • 谢谢你,这很有帮助!如果你能帮助我,我还有另一个与此类似的问题。如果我想对不同行的所有值求和,然后将行“n”的第一个/第二个/第三个/等值的比例与行的总和相加怎么办。有可能吗?
  • @LucasDresl 是的,我们可以,您可以查看cumsum(1) 和 div,我认为这将达到您的预期输出
  • 我刚刚使用了df1.iloc[:,:]/df1.iloc[0,:].sum(),我认为它有效
  • 我认为这是不正确的,因为将所有值除以第一行的总和。当我想将每个元素行除以他相应行的总和时:(@Wen
  • @LucasDresl 你能告诉我你的输出吗?或者让我们提出一个新问题:-)
猜你喜欢
  • 2012-08-05
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多