在某些条件下,随机对Pandas中的DataFrame行进行二次采样

时间:2014-04-02 05:52:56

标签: python pandas

在Python-Pandas中,我有一个包含许多行的DataFrame:

A = pd.DataFrame( { 'key1': [1 , 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, ....], 
                    'col1': [ .... ],
                    'col2': [ .... ],
                        ....
                    'col_n': [ .... ],
                    'val1': [0 , 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, ....]} )

每个键有一个或零个val1 == 1行,其余所有val1 = 0行。

我想创建一个新的DataFrame,在其中我选择val1==1的所有行,以及相应的 一个 随机样本行val1==0对于同一个密钥val1==1。要忽略所有行val1==0的键。

B = A[ A['val1']== 1] 

适用于第一部分。我不确定如何实施第二部分。

实施例: 说我有一张桌子:

key1 col1 col2 val1
 1   a     b    0
 1   c     d    0
 1   e     f    1
 1   g     h    0
 2   a     b    0
 2   c     d    1
 2   e     f    0
 3   a     b    0
 3   c     d    0
 3   e     f    0

我想得到:

key1 col1 col2 val1
 1   a     b    0 #randomly subsampled row where val1==0, for key1==1
 1   e     f    1 #row with val1==1 for key1==1
 2   e     f    0 #randomly subsampled row where val1==0, for key1==2
 2   c     d    1 #row with val1==1 for key1==2
                  #no rows for key1==3, because no rows where key1==3 & val1==1

1 个答案:

答案 0 :(得分:0)

import io
import pandas as pd
import numpy as np

text = """key1 col1 col2 val1
1   a     b    0
1   c     d    0
1   e     f    1
1   g     h    0
2   a     b    0
2   c     d    1
2   e     f    0
3   a     b    0
3   c     d    0
3   e     f    0"""

df = pd.read_csv(io.BytesIO(text), delim_whitespace=True)

def sample(df):
    mask = df.val1 == 0
    if np.all(mask):
        return None
    else:
        idx1 = mask.idxmin()
        idx0 = np.random.choice(mask[mask].index)
        return df.loc[[idx0, idx1]]

df.groupby("key1").apply(sample)

输出:

        key1 col1 col2  val1
key1                        
1    0     1    a    b     0
     2     1    e    f     1
2    4     2    a    b     0
     5     2    c    d     1