【问题标题】:Pythonic way to compare sign of numpy array with Dataframe将numpy数组的符号与Dataframe进行比较的Pythonic方法
【发布时间】:2015-03-03 04:16:58
【问题描述】:

我有一个熊猫数据框,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 列的符号。知道如何以 Python 方式执行此操作吗?

EDITII:我还有一个疑问。我的 numpy 数组应该是一维的。但正如您在上面看到的,它是二维的,我必须通过 2 个索引不必要地访问单元格。这是为什么?。这就是我创建 numpy 数组的方式(两个 1x11025 行的 df 与 11025x20 矩阵的点积,给出 1x20 数组。但它以数组的形式出现,如上所示。创建 numpy 数组的代码:

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

X_smilie_norm 是一个 28x11025 的熊猫数据框。我只访问第一行,并用 W 做一个点积,它是一个 11025x20 矩阵。当我想要的只是一维时,它给出了一个双维数组,这样我就可以只使用单个索引访问 Y1 值。

【问题讨论】:

  • IMO 使用 3x3 数组(或类似的小数组)会更清晰。

标签: python numpy pandas


【解决方案1】:

这是代码,但我不知道当第一行 df contians 为零时你想要什么结果。

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

【讨论】:

    【解决方案2】:

    您可以使用掩码并将其应用于数据框

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

    【讨论】:

      猜你喜欢
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 2014-07-11
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多