2017-08-24 41 views
1

我有这样的数据帧:的Python /大熊猫 - 选择列和行申请方程

   ano id    unit period    Sales ... 
business_id               
9564   2012 302    s anual  5964168.52 
9564   2011 303    k anual  5774707.15 
2361   2013 304    s anual  3652575.31 

对于每一行,如果单位是“K”我要乘列销售值的所有未来的人1000。这一次应该是这样的:

   ano id    unit period    Sales ... 
business_id               
9564   2012 302    s anual  5964168.52 
9564   2011 303    k anual  5774707000.15 
2361   2013 304    s anual  3652575.31 

- >我想在列销售,并在所有的未来的人(所以这将是第四列和)

如何应用它我可以这样做吗?

回答

1

你不能iloc混合布尔索引,但是你可以很容易地实现使用loc和索引关在数据帧列的相同的​​结果。

例如,要获得从五个每一列开始在上面的例子中(只有一个)符合您布尔的选择是:

>>> df.loc[df['unit'] == 'k', df.columns[5:]] 
     Sales 
1 5774707.15 
3

这里有一种方法,使用.loc选择行df.unit == 'k'和列Sales。使用*=如果你想让它多列与1000

In [1518]: df.loc[df.unit == 'k', 'Sales'] *= 1000 

In [1519]: df 
Out[1519]: 
       ano id unit period   Sales 
business_id 
9564   2012 302 s anual 5.964169e+06 
9564   2011 303 k anual 5.774707e+09 
2361   2013 304 s anual 3.652575e+06 

乘这些值。

In [1526]: df 
Out[1526]: 
       ano id unit period  Sales  Nsales 
business_id 
9564   2012 302 s anual 5964168.52 5984168.52 
9564   2011 303 k anual 5774707.15 5794707.15 
2361   2013 304 s anual 3652575.31 3672575.31 

In [1527]: df.loc[df.unit == 'k', ['Sales', 'Nsales']] *= 1000 

In [1528]: df 
Out[1528]: 
       ano id unit period   Sales  Nsales 
business_id 
9564   2012 302 s anual 5.964169e+06 5.984169e+06 
9564   2011 303 k anual 5.774707e+09 5.794707e+09 
2361   2013 304 s anual 3.652575e+06 3.672575e+06 
+0

会不会有在第四列和应用它的方式(所以我不必为每列创建一行,我的数据框很大)? – abutremutante

+1

而且,如上所述,来自位置调用的'.iloc'。我通常更喜欢显式的'.loc'作为列名。 – Zero

+0

这两个建议都很好,谢谢你们。我试图让@Alexander的建议工作,但我去了这个错误:NotImplementedError:基于iLocation的整数类型的布尔索引不可用。任何想法可能是什么? – abutremutante