有一个大型数据框,我想采取切片(根据多个布尔条件),然后修改这些切片中的条目,以便更改原始数据帧 - 即我需要view
到原版的。问题是,花哨的索引始终返回copy
。考虑.ix
方法,但使用df.ix[]
方法的布尔索引也返回一个副本。
基本上,如果df
是我的数据框,我想要查看C列,以便C!=0, A==10, B<30,...
等。在pandas中有快速的方法吗?
答案 0 :(得分:9)
即使df.loc[idx]
可能是df
的一部分的副本,assignment to 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
修改idx
df.loc[idx, ...]
的行,其中df.loc[idx, 'A'] += df.loc[idx, 'B'] * df.loc[idx, 'C']
print(df)
为True。例如,
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
产量
{{1}}
答案 1 :(得分:5)
pandas文档有一个关于Returning a view versus a copy的部分:
关于何时返回数据视图的规则完全取决于NumPy。 只要索引操作中涉及标签数组或布尔向量,结果就是副本。使用单标签/标量索引和切片,例如
df.ix[3:6]
或df.ix[:, 'A']
会返回一个视图。
答案 2 :(得分: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