如何在保留pandas中的原始数据的同时获取经过筛选的数据框进行计算?

时间:2014-01-12 17:55:50

标签: python filter pandas

我对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

现在我们过滤行以仅在市场开放的日子获得df(音量> 0)

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,为了绘制或工作迭代数据帧,它还会发送我们不想要的行。

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

那么,我们怎样才能获得排除排除行的数据框的副本,以避免这两个问题?

1 个答案:

答案 0 :(得分:1)

我认为你遇到了一个布尔索引的常见问题。当您尝试使用DataFrame布尔值过滤DataFrame时,您需要指定如何处理某些列/行的事物为True的情况,而对于其他列/行则为false。你想要的东西是真实的到处,或者在任何地方

在这种情况下特别棘手,因为你的DataFrame是1-d,所以你希望事情像Series那样工作,没有歧义:Series a row是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]

1内的all()只是在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中是错误的,但是有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]