在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
答案 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