在下面的示例数据中,我想分组列cola
并在每个组中:1)找到列colb
中的第一行,其值为g
,2)make all该行之前的行为空(对于colb
)。
注意:最初我正在寻找值2
,但我意识到我实际上想要一个字符串,所以我将其更改为g
示例数据:
cola, colb
a, s
a, g
a, a
b, s
b, d
b, g
结束目标:
cola, colb
a,
a, g
a, a
b,
b,
b, g
我正在考虑使用groupby.apply()
但是基于示例并没有完全失败。我在考虑像
def myfunc(group):
first2row = df[df['colb'] == 'g'].index[0]
df.loc[0:first2row, ['colb']] = ''
df.groupby('cola').apply(myfunc)
有什么想法或建议吗?谢谢!
答案 0 :(得分:1)
而不是函数中的df
使用与head(1)
一起传递的参数,即
def x(y):
if y[y == '2'].any():
j = y[y == '2'].head(1).index[0]
y.loc[0:j-1] = ''
return y
df['k'] = df.groupby('cola')['colb'].apply(x)
输出:
Case 1 : cola colb k 0 a 0 1 a 2 2 2 a 2 2 3 b 0 0 4 b 1 1 5 b 1 1 Case 2 : cola colb k 0 a 0 1 a 2 2 2 a 2 2 3 b 0 4 b 1 5 b 2 2
答案 1 :(得分:1)
或者您尝试transform
df['row']=df.groupby('cola')[' colb'].transform('idxmax')
df.loc[df.index<df.row,' colb']=''
df.drop('row',1)
Out[410]:
cola colb
0 a
1 a 2
2 a 2
3 b
4 b
5 b 2
更新了2
数据输入
cola colb
a 1
a 2
a 3
b 1
b 1
b 2
b 3
df['row']=df.groupby('cola')[' colb'].transform(lambda x : x[x<=2].idxmax())
df.loc[df.index<df.row,' colb']=''
df.drop('row',1)
Out[548]:
cola colb
0 a
1 a 2
2 a 3
3 b
4 b
5 b 2
6 b 3
更新3
df['row']=df.groupby('cola',as_index=False)[' colb'].transform(lambda x : (x[x==' g']).index.values[0])
df.loc[df.index<df.row,' colb']=''
df.drop('row',1)
Out[609]:
cola colb
0 a
1 a g
2 a a
3 b
4 b
5 b g