繁体   English   中英

如何获得过滤后的数据框进行计算,同时将原始数据框保留在熊猫中?

[英]How to get the filtered dataframe for calculations while retaining the original one in pandas?

我对熊猫如何使用过滤后的行有些困惑。 假设我们有这个市场数据数据框“ df”:

Time                    Open    High    Low     Close   Volume
31.12.2003 23:00:00.000 82440   83150   82440   82880   47686.32
01.01.2004 23:00:00.000 82830   83100   82350   83100   37571.04
02.01.2004 23:00:00.000 83100   83100   83100   83100   0.00

现在,我们对行进行过滤,以仅在市场开放的那一天(交易量> 0)获得df

df=df[df['Volume']>0]

由于我们过滤了数据框的方式,有一些空行仍然具有索引和值,但是例如,如果这样做,它们就不会用于计算中:

df.mean()

过滤后的行的值不会出现在计算中。

令人困惑的部分是:

仅使用未过滤的值,如何计算从第3行算起的最后2个值的平均值? 意思是,如果我们将第2行过滤掉,则应该得到第3行和第1行的平均值。

-----------编辑--------------嘿,谢谢你的评论,试图更加清楚:

假设我们有以下示例数据框:

Index    Volume
0        1 
1        0
2        1
3        1

然后我们对其进行过滤:

df=df[df['Volume']>0]

如果我们将数据帧发送到numpy,则为了绘制或遍历该数据帧,它还将发送我们不需要的行。

如果我们迭代这些数据,它还将迭代(并考虑)我们要排除的索引。

那么,如何避免排除排除行的数据框副本,从而避免这两个问题?

我认为您在布尔索引方面遇到了一个非常普遍的问题。 当你试图筛选DataFrameDataFrame的布尔值,则需要指定如何处理那里的东西是真正的某些列/行,但假的其他列/行的情况。 你想去的地方东西都是真的无处不在 ,或任何物品。

在这种情况下,这特别棘手,因为您的DataFrame是一维的,因此您希望事情像Series一样工作,而在其中没有歧义:对于Series ,行要么为True,要么为False; 在某些列中不能为True,而在其他列中不能为False。

要解决与DataFrames的歧义,请使用any()all()方法:

In [36]: df
Out[36]: 
       Volume
Index        
0           1
1           0
2           1
3           1

[4 rows x 1 columns]

In [37]: df[(df > 0).all(1)]
Out[37]: 
       Volume
Index        
0           1
2           1
3           1

[3 rows x 1 columns]

all()内部的1仅表示1轴(列)


这是一个二维示例,可以帮助您解决问题:

In [39]: df = pd.DataFrame({"A": ['a', 'b', 'c', 'd'], "B": ['e', 'f', 'g', 'h']})

In [40]: df
Out[40]: 
   A  B
0  a  e
1  b  f
2  c  g
3  d  h

[4 rows x 2 columns]

In [41]: bf = pd.DataFrame({"A": [True, True, False, False], "B": [True, False, True, False]})

In [42]: bf
Out[42]: 
       A      B
0   True   True
1   True  False
2  False   True
3  False  False

[4 rows x 2 columns]

首先,以“错误”的方式解决歧义。 目前尚不清楚该如何处理(1,'B'),因为它在bf false,但是有1行和B列,因此填充了一个NaN

In [43]: df[bf]
Out[43]: 
     A    B
0    a    e
1    b  NaN
2  NaN    g
3  NaN  NaN

[4 rows x 2 columns]

全部都只匹配第一行,因为那是唯一两个都为True的行:

In [44]: df[bf.all(1)]
Out[44]: 
   A  B
0  a  e

[1 rows x 2 columns]

any匹配除最后一行以外的所有内容,因为该行同时具有False es

In [45]: df[bf.any(1)]
Out[45]: 
   A  B
0  a  e
1  b  f
2  c  g

[3 rows x 2 columns]

暂无
暂无

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

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