繁体   English   中英

用正数创建数据框行,用负数创建其他行

[英]Create dataframe row with positive numbers and other with negative

我有以下称为Utilidad的数据

Argentina Bolivia   Chile   España  Uruguay
2004       3     6       1        3       2
2005       5     1       4        1       5

我使用以下方法计算2004年和2005年之间的差异

Utilidad.ix['resta']=Utilidad.ix[2005]-Utilidad.ix[2004]

现在,我尝试创建另外两行,其中一行的结果是当正数为差时,另一行的结果为负数,如下所示

Argentina Bolivia   Chile   España  Uruguay
2004       3     6       1        3       2
2005       5     1       4        1       5
resta      2    -5       3       -2       3
positive   2     0       3        0       3
negative   0    -5       0       -2       0

我唯一能做的就是增加一栏,告诉我“ resta”是否为正,使用

Utilidad.ix['boleano'][Utilidad.ix['resta']>0]

有人可以帮我创建另外两行吗?

谢谢

您可以使用numpy.where

df.ix['positive'] = np.where(df.ix['resta'] > 0, df.ix['resta'], 0)
df.ix['negative'] = np.where(df.ix['resta'] < 0, df.ix['resta'], 0)

numpy.clip在这里会很方便,或者只计算它即可。

In [35]:

Utilidad.ix['positive']=np.clip(Utilidad.ix['resta'], 0, np.inf)
Utilidad.ix['negative']=np.clip(Utilidad.ix['resta'], -np.inf, 0)
#or
Utilidad.ix['positive']=(Utilidad.ix['resta']+Utilidad.ix['resta'].abs())/2
Utilidad.ix['negative']=(Utilidad.ix['resta']-Utilidad.ix['resta'].abs())/2
print Utilidad
          Argentina  Bolivia  Chile  España  Uruguay
id                                                  
2004              3        6      1       3        2
2005              5        1      4       1        5
resta             2       -5      3      -2        3
positive          2        0      3       0        3
negative          0       -5      0      -2        0

[5 rows x 5 columns]

一些速度比较:

%timeit (Utilidad.ix['resta']-Utilidad.ix['resta'].abs())/2
1000 loops, best of 3: 627 µs per loop
In [36]:

%timeit Utilidad.ix['positive'] = np.where(Utilidad.ix['resta'] > 0, Utilidad.ix['resta'], 0)
1000 loops, best of 3: 647 µs per loop
In [38]:

%timeit Utilidad.ix['positive']=np.clip(Utilidad.ix['resta'], 0, 100)
100 loops, best of 3: 2.6 ms per loop
In [45]:

%timeit Utilidad.ix['resta'].clip_upper(0)
1000 loops, best of 3: 1.32 ms per loop

这里要观察的是负数是0和行的最小值:

In [11]: np.minimum(df.loc['resta'], 0)  # negative
Out[11]:
Argentina    0
Bolivia     -5
Chile        0
España      -2
Uruguay      0
Name: resta, dtype: int64

In [12]: np.maximum(df.loc['resta'], 0)  # positive
Out[12]:
Argentina    2
Bolivia      0
Chile        3
España       0
Uruguay      3
Name: resta, dtype: int64

注意:如果您担心速度,那么转置DataFrame是有意义的,因为附加列比附加行便宜得多。

您可以使用loc附加一行:

df.loc['negative'] = np.minimum(df.loc['resta'], 0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM