我尝试在多列上执行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
答案 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_index
与drop
删除列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)