2017-07-14 8 views

答えて

3

使用replace

df = df.replace({0:1, 1:0}) 

またはより高速numpy.logical_xor

df = np.logical_xor(df,1).astype(int) 

以上の高速化:

df = pd.DataFrame(np.logical_xor(df.values,1).astype(int),columns=df.columns, index=df.index) 

サンプル:

np.random.seed(12) 
df = pd.DataFrame(np.random.choice([0,1], size=[10,3])) 
print (df) 
    0 1 2 
0 1 1 0 
1 1 1 0 
2 1 1 0 
3 0 0 1 
4 0 1 1 
5 1 0 1 
6 0 0 0 
7 1 0 0 
8 1 0 1 
9 1 0 0 

df = df.replace({0:1, 1:0}) 
print (df) 
    0 1 2 
0 0 0 1 
1 0 0 1 
2 0 0 1 
3 1 1 0 
4 1 0 0 
5 0 1 0 
6 1 1 1 
7 0 1 1 
8 0 1 0 
9 0 1 1 

別の解決策:

df = (~df.astype(bool)).astype(int) 
print (df) 
    0 1 2 
0 0 0 1 
1 0 0 1 
2 0 0 1 
3 1 1 0 
4 1 0 0 
5 0 1 0 
6 1 1 1 
7 0 1 1 
8 0 1 0 
9 0 1 1 

タイミング

np.random.seed(12) 
df = pd.DataFrame(np.random.choice([0,1], size=[10000,10000])) 
print (df) 

In [69]: %timeit (np.logical_xor(df,1).astype(int)) 
1 loop, best of 3: 1.42 s per loop 

In [70]: %timeit (df^1) 
1 loop, best of 3: 2.53 s per loop 

In [71]: %timeit ((~df.astype(bool)).astype(int)) 
1 loop, best of 3: 1.81 s per loop 

In [72]: %timeit (df.replace({0:1, 1:0})) 
1 loop, best of 3: 5.08 s per loop 

In [73]: %timeit pd.DataFrame(np.logical_xor(df.values,1).astype(int), columns=df.columns, index=df.index) 
1 loop, best of 3: 350 ms per loop 

編集: これは速くする必要があります:

import numexpr as ne 
arr = df.values 
df = pd.DataFrame(ne.evaluate('1 - arr'),columns=df.columns, index=df.index) 
+0

を行うことができます?それは葛藤を作り出すのではないのですか?アルゴリズムがどのように機能するのだろうか?並行して?元のdfのビューを作成しますか? –

+0

@DiegoAgher - はい、1つは完璧に動作します。私は紛争はないと思う。そしてそれがどう動くかは、私にとっては難しい質問です... – jezrael

2

あなたのデータフレームのみの1の0を構成されている場合、あなたはXOR演算子を使用できますdf^1

In [19]: import pandas as pd 

In [20]: df = pd.DataFrame({"a": [1,0,1], "b": [0,1,1]}) 

In [21]: df 
Out[21]: 
    a b 
0 1 0 
1 0 1 
2 1 1 

In [22]: df^1 
Out[22]: 
    a b 
0 0 1 
1 1 0 
2 0 0 
2

一つの簡単な方法は次のようになります - パフォーマンスのために

df[:] = 1-df.values 

を、私たちはそうのような修正版のために、基本となる配列データで作業することをお勧めします -

a = df.values 
a[:] = 1-a 

サンプル実行 -

In [43]: df 
Out[43]: 
    0 1 2 
0 0 0 1 
1 0 0 1 
2 0 0 1 
3 1 1 0 
4 1 0 0 

In [44]: df[:] = 1-df.values 

In [45]: df 
Out[45]: 
    0 1 2 
0 1 1 0 
1 1 1 0 
2 1 1 0 
3 0 0 1 
4 0 1 1 

@jezrael's timings setupを最良のゾル

In [46]: np.random.seed(12) 
    ...: df = pd.DataFrame(np.random.choice([0,1], size=[10000,10000])) 
    ...: 

# Proposed in this post 
In [47]: def swap_0_1(df): 
    ...:  a = df.values 
    ...:  a[:] = 1-a 
    ...:  

In [48]: %timeit pd.DataFrame(np.logical_xor(df.values,1).astype(int), columns=df.columns, index=df.index) 
10 loops, best of 3: 218 ms per loop 

In [49]: %timeit swap_0_1(df) 
10 loops, best of 3: 198 ms per loop 

、あるいは入力配列データのブールバージョンの否定を使用することをお勧め - - この記事で提案する1との比較のためにその設定からutionあなたは一度であること

In [60]: def swap_0_1_bool(df): 
    ...:  a = df.values 
    ...:  a[:] = ~a.astype(bool) 
    ...:  

In [63]: %timeit swap_0_1_bool(df) 
10 loops, best of 3: 179 ms per loop 
+1

'a [:] = np.logical_not(a)'を試してみてください。これは 'astype'の再割り当てを必要としません –

関連する問題