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)

に割り当てることで、TrueがTruedfである行を変更できます。例えば、idxdf.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

パンダのドキュメントには、ビューとコピーを返すに関するセクションがあります。

データのビューがいつ返されるかに関するルールは、NumPyに完全に依存しています。ラベルの配列またはブールベクトルがインデックス作成操作に含まれる場合は常に、結果はコピーになります。単一のラベル/スカラーのインデックス作成とスライス(df.ix[3:6]または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 に答える