Pandas / Numpy: np.where问题

0 投票
1 回答
987 浏览
提问于 2025-04-18 07:20

我遇到了一个奇怪的问题,跟 np.where 有关。我首先加载了一个叫 df 的数据库,然后创建了它的一个副本 df1。接着,我用 np.where 来处理 df1 中的每个值,如果某个单元格里的数字大于或等于它的平均值(这个平均值在 df_mean 里),那么就把这个单元格的值设为 1;否则就设为 0。我用一个循环来遍历 df1 中的每个列名,以及一系列的平均值 df_mean。这是我的代码:

#Load the data

df = pd.read_csv('F:\\file.csv')

df.head(2)
>>>                     A        AA       AAP      AAPL       ABC    
2011-01-10 09:30:00 -0.000546  0.006528 -0.001051  0.034593 -0.000095 ...
2011-01-10 09:30:10 -0.000256  0.007705 -0.001134  0.008578 -0.000549 ...

# Show list file with columns average

>>> df_mean.head(4)
A       0.000656
AA      0.002068
AAP     0.001134
AAPL    0.001728
...

df_1 = df
for x in list:
    df_1[x] = np.where(df_1[x] >= *df_mean[x], 1, 0)

>>> df_1.head(4) #Which is my desired output (but which also makes df = df_1...WHY?)
                     A  AA  AAP  AAPL  ABC    
2011-01-10 09:30:00  0   1    0     1    0 ...
2011-01-10 09:30:10  0   1    0     1    0 ...
2011-01-10 09:30:20  0   0    0     1    0 ...
2011-01-10 09:30:30  0   0    0     1    1 ...

现在,我得到了我想要的结果,也就是 df1 变成了一个只有 1 和 0 的矩阵,但奇怪的是 df 也变成了一个二进制矩阵(和 df1 一样)。这是为什么呢?我的循环并没有涉及到 df……

1 个回答

1

虽然这不是你问的内容,但我感觉你想找一种方法来判断一只股票目前是表现得很好还是不好,可能是想用某种“平均值”来比较一下。你可以试试这个:

S = pd.DataFrame(
    np.array([[1.2,3.4],[1.1,3.5],[1.4,3.3],[1.2,1.6]]),
    columns=["Stock A","Stock B"],
    index=pd.date_range("2014-01-01","2014-01-04",freq="D")
)

indicator = S > S.mean()
binary = indicator.astype("int")
print S
print indicator
print binary 

这样会得到以下结果:

            Stock A  Stock B
2014-01-01      1.2      3.4
2014-01-02      1.1      3.5
2014-01-03      1.4      3.3
2014-01-04      1.2      1.6
[4 rows x 2 columns]

           Stock A Stock B
2014-01-01   False    True
2014-01-02   False    True
2014-01-03    True    True
2014-01-04   False   False
[4 rows x 2 columns]

            Stock A  Stock B
2014-01-01        0        1
2014-01-02        0        1
2014-01-03        1        1
2014-01-04        0        0
[4 rows x 2 columns]

顺便提一下,你可能还应该看看 pd.rolling_mean(S, n_periods_for_mean)

撰写回答