2017-04-25 38 views
5

Thông thường khi sử dụng phương thức .apply(), một hàm vượt qua một đối số chính xác.Pandas GroupBy: áp dụng một hàm với hai đối số

def somefunction(group): 
    group['ColumnC'] == group['ColumnC']**2 
    return group 

df.groupby(['ColumnA', 'ColumnB']).apply(somefunction) 

Ở đây somefunction được áp dụng cho mỗi group, sau đó được trả lại. Về cơ bản tôi đang sử dụng số này example here.

Tôi muốn có khả năng không chỉ định tên cột ColumnC trước đó. Vượt qua nó như một đối số của somefunction sẽ làm cho mã linh hoạt hơn.

def somefunction(group, column_name): 
    group[column_name] == group[column_name]**2 
    return group 

df.groupby(['ColumnA', 'ColumnB']).apply(somefunction) 

Có cách nào để thực hiện công việc này không? Tôi không thể vượt qua group đến somefunction, bởi vì điều đó được thực hiện một cách kỳ diệu bởi .apply() ở chế độ nền.

Trả lời

6

bạn có thể vượt qua đối số từ khóa thông qua apply

df.groupby(['ColumnA', 'ColumnB']).apply(somefunction, column_name='col') 

MCVE

df = pd.DataFrame(dict(A=list(range(2)) * 5, B=range(10)[::-1])) 

def f(df, arg1): 
    return df * arg1 

df.groupby('A').apply(f, arg1=3) 

    A B 
0 0 27 
1 3 24 
2 0 21 
3 3 18 
4 0 15 
5 3 12 
6 0 9 
7 3 6 
8 0 3 
9 3 0 
+0

Điều đó dễ hơn dự kiến. Cảm ơn! –

+0

@mischi vui vì tôi có thể giúp. – piRSquared

1

Bạn có thể thực hiện một chức năng ẩn danh

df.groupby(['ColumnA', 'ColumnB']).apply(lambda x: somefunction(x, 'col'))

Các vấn đề liên quan