Pythonic方式比较numpy数组的符号与Dataframe

时间:2015-03-03 04:16:59

标签: python numpy pandas

我有一个pandas数据框,df。第一行的内容如下:

-1387.900
1    -1149.000
2     1526.300
3     1306.300
4     1134.300
5    -1077.200
6     -734.890
7     -340.870
8     -268.970
9     -176.070
10    -515.510
11     283.440
12     -55.148
13   -1701.800
14     -63.294
15    -270.720
16    2216.800
17    4251.200
18    1459.000
19    -613.680

这基本上是一个系列。我有一个(1x20)numpy数组,如下所示:

array([[ 1308.22000654,  -920.02730748,  1285.54273707, -1119.67498439,
          789.50281435,  -331.14325768,   756.67399745,  -101.9251545 ,
          157.17779635,  -333.17043669,  -191.10517521,  -127.80219696,
          698.32168135,   154.30798847, -1055.54268665, -1795.96042107,
          202.53471769,    25.58830318,   793.63902134,   220.94259961]])

现在我想要的是,对于df数据帧的这一行的每个单元格值,我需要检查该单元格的符号是否与上述numpy数组的相应单元格符号相同。如果符号不同,那么对于df中的所有行,对于相应的坐标,翻转df中每个相应坐标值的符号。对于前者如果你看到第一个单元格值。 Df有-1387而numpy数组有1380.所以现在df帧的第一列应该反转它的符号。与其他列相同。

我正在使用for循环。  喜欢

for x in range(20):
   if(np.sign(Y1[0][x])!=np.sign(df.ix[0][x])):
       if(np.sign(Y1[0][x])==0 and np.sign(df.ix[0][x]>0)):
          df[x]=df[x]*1
       else: 
          df[x]=df[x]*(-1)

我还需要确保如果np.sign(Y [x])= 0那么它所采用的符号不是零而是+1。我可以在上面的代码中添加这个条件,但重点是如何使它更加pythonic?

编辑:我添加了我编写的代码似乎工作正常,并根据上述条件翻转df列的符号。我想知道如何用pythonic方式做到这一点?

EDITII:我还有一个疑问。我的numpy数组应该是单维的。但正如你在上面看到的那样,它将成为2维,我不得不通过2个索引不必要地访问单元格。这是为什么?。这就是我创建numpy数组的方法(两个1x11025行的df与11025x20矩阵的dot产品给出1x20数组。但它就像上面所见的数组一样。代码来创建numpy数组:

Y1=np.dot(X_smilie_norm[0:1],W)

X_smilie_norm是一个28x11025的pandas数据帧。我正在访问第一行并使用W(11025x20矩阵)进行点积。当我想要的只是单维时,它给出了一个双维数组,这样我就能用单个索引访问Y1值。

2 个答案:

答案 0 :(得分:0)

这是代码,但是当第一行df为0时,我不知道你想要的结果。

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(-10, 10, (10, 12)))
sign = np.random.randint(-10, 10, 12)
df.loc[:, (df.iloc[0] >= 0) ^ (sign >= 0)] *= -1

答案 1 :(得分:0)

您可以使用遮罩并将其应用于数据框

mask = (arr <= 0) != (df <= 0) # true if signs are different
df[mask] = -df[mask] # flip the signs on those members where mask is true