可以生成视图的布尔索引大 pandas 数据框?

13 投票
3 回答
3299 浏览
提问于 2025-04-17 17:29

我有一个很大的数据表(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.ilocdf.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

撰写回答