Helpex - Trao đổi & giúp đỡ Đăng nhập

Tính giá trị trung bình của mọi x hàng trong bảng và tạo bảng mới

Hoàng Khánh Chi
· 12:06 23/04/2016
2 ngày trước

Tôi có một bảng dữ liệu dài (~ 200 hàng x 50 cột) và tôi cần tạo mã có thể tính giá trị trung bình của mỗi hai hàng và cho mỗi cột trong bảng với đầu ra cuối cùng là một bảng giá trị trung bình mới các giá trị. Điều này rõ ràng là điên rồ khi làm trong Excel! Tôi sử dụng python3 và tôi biết một số câu hỏi tương tự: đây , đâyđây . Nhưng không có cách nào trong số này hữu ích vì tôi cần một số mã thanh lịch để làm việc với nhiều cột và tạo ra một bảng dữ liệu có tổ chức. Nhân tiện, dữ liệu ban đầu của tôi đã được nhập bằng cách sử dụng gấu trúc và được định nghĩa là khung dữ liệu nhưng không thể tìm thấy cách dễ dàng để thực hiện việc này ở gấu trúc. Trợ giúp được đánh giá cao.

Một ví dụ về bảng (phiên bản ngắn) là:

a   b   c   d
2   50  25  26
4   11  38  44
6   33  16  25
8   37  27  25
10  28  48  32
12  47  35  45
14  8   16  7
16  12  16  30
18  22  39  29
20  9   15  47

Bảng trung bình mong đợi:

a    b     c     d
3   30.5  31.5  35
7   35    21.5  25
11  37.5  41.5  38.5
15  10    16    18.5
19  15.5  27    38
33 hữu ích 0 bình luận 27k xem chia sẻ
Đỗ Bảo Quyên
· 12:13 23/04/2016
12:13:12 23/04/2016

Bạn có thể tạo một nhóm nhân tạo bằng cách sử dụng df.index//2(hoặc như @DSM đã chỉ ra, bằng cách sử dụng np.arange(len(df))//2- để nó hoạt động cho tất cả các chỉ số) và sau đó sử dụng groupby:

df.groupby(np.arange(len(df))//2).mean()
Out[13]: 
      a     b     c     d
0   3.0  30.5  31.5  35.0
1   7.0  35.0  21.5  25.0
2  11.0  37.5  41.5  38.5
3  15.0  10.0  16.0  18.5
4  19.0  15.5  27.0  38.0
44 hữu ích 5 bình luận chia sẻ
Trần Gia Bình
· 19:19 27/02/2018
19:19:31 27/02/2018

Bạn có thể giải quyết vấn đề này bằng cách sử dụng pd.rolling()để tạo trung bình cuộn và sau đó chỉ cần lấy từng phần tử thứ hai bằng cách sử dụngiloc

df = df.rolling(2).mean() 
df = df.iloc[::2, :]

Lưu ý rằng quan sát đầu tiên sẽ bị thiếu (tức là quá trình cuộn bắt đầu ở trên cùng) vì vậy hãy đảm bảo kiểm tra xem dữ liệu của bạn được sắp xếp theo cách bạn cần.

18 hữu ích 1 bình luận chia sẻ
Hoàng Thục Trang
· 12:18 23/04/2016
12:18:46 23/04/2016

Cách NumPythonic sẽ là trích xuất các phần tử dưới dạng một mảng NumPy df.values, sau đó định hình lại thành một 3Dmảng có 2các phần tử cùng axis=14dọc theo axis=2và thực hiện giảm trung bình axis=1và cuối cùng chuyển đổi trở lại khung dữ liệu, như vậy -

pd.DataFrame(df.values.reshape(-1,2,df.shape[1]).mean(1))

Hóa ra, bạn có thể giới thiệu công cụ rất hiệu quả của NumPy: np.einsumđể thực hiện điều này average-reductionnhư một sự kết hợp của sum-reductionscaling-down, giống như vậy -

pd.DataFrame(np.einsum('ijk->ik',df.values.reshape(-1,2,df.shape[1]))/2.0)

Xin lưu ý rằng các phương pháp được đề xuất giả định rằng số hàng chia hết cho 2.

Ngoài ra noted by @DSM, để giữ nguyên tên cột, bạn cần thêm columns=df.columnskhi chuyển đổi trở lại Dataframe, tức là -

pd.DataFrame(...,columns=df.columns)

Chạy mẫu -

>>> df
    0   1   2   3
0   2  50  25  26
1   4  11  38  44
2   6  33  16  25
3   8  37  27  25
4  10  28  48  32
5  12  47  35  45
6  14   8  16   7
7  16  12  16  30
8  18  22  39  29
9  20   9  15  47
>>> pd.DataFrame(df.values.reshape(-1,2,df.shape[1]).mean(1))
    0     1     2     3
0   3  30.5  31.5  35.0
1   7  35.0  21.5  25.0
2  11  37.5  41.5  38.5
3  15  10.0  16.0  18.5
4  19  15.5  27.0  38.0
>>> pd.DataFrame(np.einsum('ijk->ik',df.values.reshape(-1,2,df.shape[1]))/2.0)
    0     1     2     3
0   3  30.5  31.5  35.0
1   7  35.0  21.5  25.0
2  11  37.5  41.5  38.5
3  15  10.0  16.0  18.5
4  19  15.5  27.0  38.0

Kiểm tra thời gian chạy -

Trong phần này, chúng ta hãy thử nghiệm tất cả ba cách tiếp cận được liệt kê cho đến nay để giải quyết vấn đề về hiệu suất, bao gồm @ayhan's solution with groupby.

In [24]: A = np.random.randint(0,9,(200,50))

In [25]: df = pd.DataFrame(A)

In [26]: %timeit df.groupby(df.index//2).mean() # @ayhan's solution
1000 loops, best of 3: 1.61 ms per loop

In [27]: %timeit pd.DataFrame(df.values.reshape(-1,2,df.shape[1]).mean(1))
1000 loops, best of 3: 317 µs per loop

In [28]: %timeit pd.DataFrame(np.einsum('ijk->ik',df.values.reshape(-1,2,df.shape[1]))/2.0)
1000 loops, best of 3: 266 µs per loop
9 hữu ích 4 bình luận chia sẻ
Vũ Hiểu Vân
· 20:31 05/08/2017
20:31:00 05/08/2017
df.set_index(np.arange(len(df)) // 2).mean(level=0)
5 hữu ích 0 bình luận chia sẻ
Phạm Hữu Trung
· 13:23 07/01/2021
13:23:23 07/01/2021

Trong trường hợp của bạn, khi bạn muốn tính trung bình các hàng, giả sử tên khung dữ liệu của bạn là new

new = new.groupby(np.arange(len(new)) // 2).mean() 

Nếu ai đó muốn tính giá trị trung bình cho các cột

new = new.groupby(np.arrange(len(new.columns)) // 2, axis=1).mean()
1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python python-3.x pandas dataframe numpy , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm