可以生成视图的布尔索引大 pandas 数据框?
我有一个很大的数据表(dataframe),我想根据多个条件来选取其中的一部分数据,然后修改这些数据,以便改变原来的数据表。也就是说,我需要一个原始数据的“视图”。问题是,使用复杂的索引方法总是会返回一个“副本”。我想到了 .ix
方法,但用 df.ix[]
进行布尔索引时也会返回一个副本。
简单来说,如果 df
是我的数据表,我想要一个指向列 C 的视图,条件是 C!=0, A==10, B<30,...
等等。有没有快速的方法在 pandas 中做到这一点?
3 个回答
0
基于unutbu的例子,你还可以像这样在df.index上使用布尔索引:
In [11]: df.ix[df.index[idx]] = 999
In [12]: df
Out[12]:
A B C
0 9 23 -6
1 999 999 999
2 9 25 -4
3 999 999 999
4 9 27 -2
5 999 999 999
6 9 29 0
7 10 30 1
8 9 31 2
9 10 32 3
10 9 33 4
11 10 34 5
6
在pandas的文档中,有一部分讲到了返回视图和副本的区别:
关于什么时候返回数据的视图,这完全取决于NumPy。只要在索引操作中涉及到标签数组或布尔向量,结果就会是一个副本。 而如果是单个标签或切片操作,比如
df.ix[3:6]
或df.ix[:, 'A']
,那么返回的就是一个视图。
9
虽然 df.loc[idx]
可能只是 df
的一部分的副本,但对 df.loc[idx]
的 赋值 实际上会直接修改 df
本身。(这同样适用于 df.iloc
和 df.ix
。)
举个例子,
import pandas as pd
import numpy as np
df = pd.DataFrame({'A':[9,10]*6,
'B':range(23,35),
'C':range(-6,6)})
print(df)
# A B C
# 0 9 23 -6
# 1 10 24 -5
# 2 9 25 -4
# 3 10 26 -3
# 4 9 27 -2
# 5 10 28 -1
# 6 9 29 0
# 7 10 30 1
# 8 9 31 2
# 9 10 32 3
# 10 9 33 4
# 11 10 34 5
这是我们的布尔索引:
idx = (df['C']!=0) & (df['A']==10) & (df['B']<30)
我们可以通过对 df.loc[idx, ...]
进行赋值,来修改那些 idx
为 True 的行。例如,
df.loc[idx, 'A'] += df.loc[idx, 'B'] * df.loc[idx, 'C']
print(df)
结果是
A B C
0 9 23 -6
1 -110 24 -5
2 9 25 -4
3 -68 26 -3
4 9 27 -2
5 -18 28 -1
6 9 29 0
7 10 30 1
8 9 31 2
9 10 32 3
10 9 33 4
11 10 34 5