我对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,为了绘制或工作迭代数据帧,它还会发送我们不想要的行。
如果我们迭代这些数据,它也会迭代(并考虑)我们排除的索引。
那么,我们怎样才能获得排除排除行的数据框的副本,以避免这两个问题?
答案 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]