説明するためのサンプル:
np.random.seed(12)
df = pd.DataFrame(np.random.randn(8,4),
index = pd.date_range('20000101',periods=8),
columns = list('ABCD'))
print (df)
A B C D
2000-01-01 0.472986 -0.681426 0.242439 -1.700736
2000-01-02 0.753143 -1.534721 0.005127 -0.120228
2000-01-03 -0.806982 2.871819 -0.597823 0.472457
2000-01-04 1.095956 -1.215169 1.342356 -0.122150
2000-01-05 1.012515 -0.913869 -1.029530 1.209796
2000-01-06 0.501872 0.138846 0.640761 0.527333
2000-01-07 -1.154360 -2.213333 -1.681757 -1.788094
2000-01-08 -2.218535 -0.647431 -0.528404 -0.039209
#boolean mask by condition
print (df>0)
A B C D
2000-01-01 True False True False
2000-01-02 True False True False
2000-01-03 False True False True
2000-01-04 True False True False
2000-01-05 True False False True
2000-01-06 True True True True
2000-01-07 False False False False
2000-01-08 False False False False
#without define value for replace False of mask values create NaNs
print (df.where(df>0))
A B C D
2000-01-01 0.472986 NaN 0.242439 NaN
2000-01-02 0.753143 NaN 0.005127 NaN
2000-01-03 NaN 2.871819 NaN 0.472457
2000-01-04 1.095956 NaN 1.342356 NaN
2000-01-05 1.012515 NaN NaN 1.209796
2000-01-06 0.501872 0.138846 0.640761 0.527333
2000-01-07 NaN NaN NaN NaN
2000-01-08 NaN NaN NaN NaN
ためのいくつかのSeries
(行)によってマスクのFalse
を置き換えるには、axis=1
を必要 - 列は(broadcasting)繰り返している:
print (df.loc['2000-01-01'])
A 0.472986
B -0.681426
C 0.242439
D -1.700736
Name: 2000-01-01 00:00:00, dtype: float64
print (df.where(df>0, df.loc['2000-01-01'], axis = 1))
A B C D
2000-01-01 0.472986 -0.681426 0.242439 -1.700736
2000-01-02 0.753143 -0.681426 0.005127 -1.700736
2000-01-03 0.472986 2.871819 0.242439 0.472457
2000-01-04 1.095956 -0.681426 1.342356 -1.700736
2000-01-05 1.012515 -0.681426 0.242439 1.209796
2000-01-06 0.501872 0.138846 0.640761 0.527333
2000-01-07 0.472986 -0.681426 0.242439 -1.700736
2000-01-08 0.472986 -0.681426 0.242439 -1.700736
そして交換のためにSeries
(列)が必要axis=0
- カラムが
print (df.A)
2000-01-01 0.472986
2000-01-02 0.753143
2000-01-03 -0.806982
2000-01-04 1.095956
2000-01-05 1.012515
2000-01-06 0.501872
2000-01-07 -1.154360
2000-01-08 -2.218535
Freq: D, Name: A, dtype: float64
print (df.where(df>0, df.A, axis = 0))
A B C D
2000-01-01 0.472986 0.472986 0.242439 0.472986
2000-01-02 0.753143 0.753143 0.005127 0.753143
2000-01-03 -0.806982 2.871819 -0.806982 0.472457
2000-01-04 1.095956 1.095956 1.342356 1.095956
2000-01-05 1.012515 1.012515 1.012515 1.209796
2000-01-06 0.501872 0.138846 0.640761 0.527333
2000-01-07 -1.154360 -1.154360 -1.154360 -1.154360
2000-01-08 -2.218535 -2.218535 -2.218535 -2.218535
(broadcasting)繰り返しているため、別のDataFrame
によって置き換える:
df1 = pd.DataFrame(np.random.randint(10, size=(8,4)),
index = pd.date_range('20000101',periods=8),
columns = list('ABCD'))
print (df1)
A B C D
2000-01-01 5 3 5 0
2000-01-02 2 9 6 4
2000-01-03 7 6 2 3
2000-01-04 2 6 4 5
2000-01-05 0 0 5 4
2000-01-06 0 3 7 9
2000-01-07 6 8 6 1
2000-01-08 4 9 6 5
print (df.where(df>0, df1))
A B C D
2000-01-01 0.472986 3.000000 0.242439 0.000000
2000-01-02 0.753143 9.000000 0.005127 4.000000
2000-01-03 7.000000 2.871819 2.000000 0.472457
2000-01-04 1.095956 6.000000 1.342356 5.000000
2000-01-05 1.012515 0.000000 5.000000 1.209796
2000-01-06 0.501872 0.138846 0.640761 0.527333
2000-01-07 6.000000 8.000000 6.000000 1.000000
2000-01-08 4.000000 9.000000 6.000000 5.000000
EDIT:位置合わせを説明する
:
をここwhere
関数は2つのオブジェクトと協力して( Series、DataFrame)、共通の列を参照すると、共通のインデックス名data ar整列され、機能が適用されます。したがって、ここではのSeries
と、DataFrameの列A,B
とが一致し、他の列はNaNを取得します。
s = pd.Series(np.random.randint(10, size=4) , index = list('ABEF'))
print (s)
A 5
B 3
E 5
F 0
dtype: int32
print (df.where(df>0, s, axis=1))
A B C D
2000-01-01 0.472986 3.000000 0.242439 NaN
2000-01-02 0.753143 3.000000 0.005127 NaN
2000-01-03 5.000000 2.871819 NaN 0.472457
2000-01-04 1.095956 3.000000 1.342356 NaN
2000-01-05 1.012515 3.000000 NaN 1.209796
2000-01-06 0.501872 0.138846 0.640761 0.527333
2000-01-07 5.000000 3.000000 NaN NaN
2000-01-08 5.000000 3.000000 NaN NaN
EDIT1:level
パラメータと
サンプル:
DataFrame
はMultiIndex
を有している場合、それは、Multiindex
のレベルが機能where
に使用される特定のために必要な追加パラメータlevel
あります。
np.random.seed(12)
mux = pd.MultiIndex.from_arrays([pd.date_range('20000101',periods=8), list('aaaabbbb')],
names=('date', 'par'))
df = pd.DataFrame(np.random.randn(8,4),
index = mux,
columns = list('ABCD'))
print (df)
A B C D
date par
2000-01-01 a 0.472986 -0.681426 0.242439 -1.700736
2000-01-02 a 0.753143 -1.534721 0.005127 -0.120228
2000-01-03 a -0.806982 2.871819 -0.597823 0.472457
2000-01-04 a 1.095956 -1.215169 1.342356 -0.122150
2000-01-05 b 1.012515 -0.913869 -1.029530 1.209796
2000-01-06 b 0.501872 0.138846 0.640761 0.527333
2000-01-07 b -1.154360 -2.213333 -1.681757 -1.788094
2000-01-08 b -2.218535 -0.647431 -0.528404 -0.039209
s = pd.Series(np.random.randint(10, size=2) , index = list('ac'))
print (s)
a 5
c 3
dtype: int32
print (df.where(df>0, s, axis=0, level=1))
A B C D
date par
2000-01-01 a 0.472986 5.000000 0.242439 5.000000
2000-01-02 a 0.753143 5.000000 0.005127 5.000000
2000-01-03 a 5.000000 2.871819 5.000000 0.472457
2000-01-04 a 1.095956 5.000000 1.342356 5.000000
2000-01-05 b 1.012515 NaN NaN 1.209796
2000-01-06 b 0.501872 0.138846 0.640761 0.527333
2000-01-07 b NaN NaN NaN NaN
2000-01-08 b NaN NaN NaN NaN
パラメータ 'level'はどのようなものですか? –
私の意見では、列やインデックスのマルチインデックスのためです。それほど頻繁に使用されません。 (英語は私にとっては難しい) – jezrael
@AnshKumar - ありがとう。 – jezrael