Groupby和Sample pandas

时间:2018-03-29 11:05:06

标签: python pandas random pandas-groupby

我尝试在多列上执行groupby后对结果数据进行采样。如果相应的groupby有2个以上的元素,我想取样2记录,否则记录所有记录

DF:

col1   col2   col3   col4
A1     A2     A3     A4
A1     A2     A3     A5
A1     A2     A3     A6
B1     B2     B3     B4
B1     B2     B3     B5
C1     C2     C3     C4

目标df:

col1   col2   col3   col4
A1     A2     A3     A4 or A5 or A6
A1     A2     A3     A4 or A5 or A6
B1     B2     B3     B4
B1     B2     B3     B5
C1     C2     C3     C4

我之前提到了A4或A5或A6,因为当我们采样时,三者中的任何一个都可能返回

这是我到目前为止所尝试的:

trial = pd.DataFrame(df.groupby(['col1', 'col2','col3'])['col4'].apply(lambda x: x if (len(x) <=2) else x.sample(2)))

然而,在这里,我没有得到col1,col2和col3

2 个答案:

答案 0 :(得分:1)

我认为需要加倍reset_index - 首先删除3.rd MultiIndex级别,然后将MultiIndex转换为列:

trial= (df.groupby(['col1', 'col2','col3'])['col4']
        .apply(lambda x: x if (len(x) <=2) else x.sample(2))
        .reset_index(level=3, drop=True)
        .reset_index())

reset_indexdrop删除列level_3

trial= (df.groupby(['col1', 'col2','col3'])['col4']
        .apply(lambda x: x if (len(x) <=2) else x.sample(2))
        .reset_index()
        .drop('level_3', 1))

print (trial)
  col1 col2 col3 col4
0   A1   A2   A3   A4
1   A1   A2   A3   A6
2   B1   B2   B3   B4
3   B1   B2   B3   B5
4   C1   C2   C3   C4

答案 1 :(得分:0)

默认情况下,无需将其转换为pandas数据帧

trial=df.groupby(['col1', 'col2','col3'])['col4'].apply(lambda x: x if (len(x) <=2) else x.sample(2))

这应该添加col1,2,3

trial.reset_index(inplace=True,drop=False)