を無作為に置き換える。 id
とvalue
ここでvalue
は0
またはのいずれかです。value==1
の10%
を0
にランダムに置き換えたいと思います。パンダは、2列の単純なパンダデータフレームを有するkパーセント
この動作をパンダでどうやって達成できますか?
を無作為に置き換える。 id
とvalue
ここでvalue
は0
またはのいずれかです。value==1
の10%
を0
にランダムに置き換えたいと思います。パンダは、2列の単純なパンダデータフレームを有するkパーセント
この動作をパンダでどうやって達成できますか?
pandas
答え
query
は割り当てるために、結果のインデックスを使用したものvalue == 1
sample(frac=.1)
でdf
をフィルタ取得するためにゼロdf.loc[
df.query('value == 1').sample(frac=.1).index,
'value'
] = 0
代替numpy
答え
df['value']
が1
v = df.value.values == 1
df.loc[v, 'value'] = np.random.choice((0, 1), v.sum(), p=(.1, .9))
あなたはおそらくnumpy.random.choice
を使用することができます。
>>> idx = df.index[df.value==1]
>>> df.loc[np.random.choice(idx, size=idx.size/10, replace=False)].value = 0
OPはランダムにdf全体のランダムなサンプルではなく '1'の行だけを置き換えたいと思っています – EdChum
私はそれを逃して答えを変えようとしました –
ここnp.random.choice
とnumpyのアプローチだ -
a = df.value.values # get a view into value col
idx = np.flatnonzero(a) # get the nonzero indices
# Finally select unique 10% from those indices and set 0s there
a[np.random.choice(idx,size=int(0.1*len(idx)),replace=0)] = 0
サンプル実行 -
In [237]: df = pd.DataFrame(np.random.randint(0,2,(100,2)),columns=['id','value'])
In [238]: (df.value==1).sum() # Original Count of 1s in df.value column
Out[238]: 53
In [239]: a = df.value.values
In [240]: idx = np.flatnonzero(a)
In [241]: a[np.random.choice(idx,size=int(0.1*len(idx)),replace=0)] = 0
In [242]: (df.value==1).sum() # New count of 1s in df.value column
Out[242]: 48
、もう少しパンダアプローチ -
idx = np.flatnonzero(df['value'])
df.ix[np.random.choice(idx,size=int(0.1*len(idx)),replace=0),'value'] = 0
ランタイム試験
これまでに投稿されたすべてのアプローチ -
def f1(df): #@piRSquared's soln1
df.loc[df.query('value == 1').sample(frac=.1).index,'value'] = 0
def f2(df): #@piRSquared's soln2
v = df.value.values == 1
df.loc[v, 'value'] = np.random.choice((0, 1), v.sum(), p=(.1, .9))
def f3(df): #@Roman Pekar's soln
idx = df.index[df.value==1]
df.loc[np.random.choice(idx, size=idx.size/10, replace=False)].value = 0
def f4(df): #@Mine soln1
a = df.value.values
idx = np.flatnonzero(a)
a[np.random.choice(idx,size=int(0.1*len(idx)),replace=0)] = 0
def f5(df): #@Mine soln2
idx = np.flatnonzero(df['value'])
df.ix[np.random.choice(idx,size=int(0.1*len(idx)),replace=0),'value'] = 0
タイミング -
In [2]: # Setup inputs
...: df = pd.DataFrame(np.random.randint(0,2,(10000,2)),columns=['id','value'])
...: df1 = df.copy()
...: df2 = df.copy()
...: df3 = df.copy()
...: df4 = df.copy()
...: df5 = df.copy()
...:
In [3]: # Timings
...: %timeit f1(df1)
...: %timeit f2(df2)
...: %timeit f3(df3)
...: %timeit f4(df4)
...: %timeit f5(df5)
...:
100 loops, best of 3: 3.96 ms per loop
1000 loops, best of 3: 844 µs per loop
1000 loops, best of 3: 1.62 ms per loop
10000 loops, best of 3: 163 µs per loop
1000 loops, best of 3: 663 µs per loop
あなたは 'query'関数のスポンサーになっています:-) – Boud
@Boud私は特定の機能に集中し、多くの質問に答える傾向があります。 – piRSquared