Tôi đang cố gắng bọc đầu xung quanh các phương pháp nhóm Pandas. Tôi muốn viết một hàm thực hiện một số hàm tổng hợp và sau đó trả về một khung dữ liệu Pandas. Dưới đây là một ví dụ đơn giản hóa tổng thể bằng cách sử dụng sum(). Tôi biết có nhiều cách dễ dàng hơn để làm tiền đơn giản, trong cuộc sống thực chức năng của tôi là phức tạp hơn:trả lại dữ liệu tổng hợp từ nhóm gấu trúc theo số
import pandas as pd
df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B'], 'col2':[1.0, 2, 3, 4]})
In [3]: df
Out[3]:
col1 col2
0 A 1
1 A 2
2 B 3
3 B 4
def func2(df):
dfout = pd.DataFrame({ 'col1' : df['col1'].unique() ,
'someData': sum(df['col2']) })
return dfout
t = df.groupby('col1').apply(func2)
In [6]: t
Out[6]:
col1 someData
col1
A 0 A 3
B 0 B 7
tôi đã không mong đợi để có col1
trong đó hai lần tôi cũng không hy vọng rằng điều index bí ẩn tìm kiếm. Tôi thực sự nghĩ rằng tôi sẽ chỉ nhận được col1
& someData
.
Trong ứng dụng thực tế, tôi đang nhóm theo nhiều cột và thực sự muốn lấy lại một DataFrame chứ không phải đối tượng Series.
Bất kỳ ý tưởng nào về giải pháp hoặc giải thích về những gì Pandas đang làm trong ví dụ trên của tôi?
----- Thông tin thêm -----
Lẽ ra tôi nên bắt đầu với ví dụ này, tôi nghĩ:
In [13]: import pandas as pd
In [14]: df = pd.DataFrame({'col1':['A','A','A','B','B','B'], 'col2':['C','D','D','D','C','C'], 'col3':[.1,.2,.4,.6,.8,1]})
In [15]: df
Out[15]:
col1 col2 col3
0 A C 0.1
1 A D 0.2
2 A D 0.4
3 B D 0.6
4 B C 0.8
5 B C 1.0
In [16]: def func3(df):
....: dfout = sum(df['col3']**2)
....: return dfout
....:
In [17]: t = df.groupby(['col1', 'col2']).apply(func3)
In [18]: t
Out[18]:
col1 col2
A C 0.01
D 0.20
B C 1.64
D 0.36
Trong hình minh họa trên là kết quả của các apply()
chức năng là một loạt Pandas. Và nó thiếu các cột nhóm từ df.groupby
. Bản chất của những gì tôi đang đấu tranh là làm thế nào để tôi tạo ra một chức năng mà tôi áp dụng cho một groupby mà trả về cả kết quả của hàm AND các cột mà nó được nhóm lại?
----- chưa cập nhật khác ------
Dường như nếu tôi sau đó làm điều này:
pd.DataFrame(t).reset_index()
tôi nhận lại một dataframe mà thực sự gần gũi với những gì tôi đã sau.
btw, hướng dẫn này bằng một trong những lập trình viên gấu trúc đã giúp tôi hiểu được groupby và tập hợp cơ học của gấu trúc: https://www.youtube.com/watch?v=MxRMXhjXZos – Zelazny7
Trong ví dụ này bạn đã nối , mục đích của groupby là gì (nó sẽ chỉ tìm thấy dupes), bạn có thể chỉ cần áp dụng cho chính df và thêm nó như là một cột: 'df ['func3'] = df.áp dụng (hàng lambda: hàng ['col2'] ** 2, trục = 1) '. ? –
Dữ liệu hơi đơn giản cho ví dụ, tôi sợ. Tôi sẽ cập nhật ví dụ. –