13

得到了一个大数据框,我想对它进行切片(根据多个布尔标准),然后修改这些切片中的条目以更改原始数据框 - 即我需要原始数据框view。问题是,花哨的索引总是返回一个copy. 想到了.ix方法,但是用该方法进行布尔索引df.ix[]也返回一个副本。

本质上,如果df是我的数据框,我想要一个 C 列的视图,C!=0, A==10, B<30,...等等。在熊猫中有没有快速的方法来做到这一点?

4

3 回答 3

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我们可以通过赋值来修改whereidx为 True 的那些行df.loc[idx, ...]。例如,

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
于 2013-02-28T20:16:14.217 回答
6

pandas 文档有一个关于返回视图与副本的部分:

关于何时返回数据视图的规则完全取决于 NumPy。每当索引操作涉及标签数组或布尔向量时,结果将是一个副本。使用单个标签/标量索引和切片,例如df.ix[3:6]or df.ix[:, 'A'],将返回一个视图。

于 2013-02-28T20:17:30.067 回答
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
于 2013-02-28T20:28:05.213 回答