将功能应用于组以更改数据

时间:2017-09-01 13:34:25

标签: python-2.7 pandas

在下面的示例数据中,我想分组列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)

有什么想法或建议吗?谢谢!

2 个答案:

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