Gấu trúc mỗi hàng thứ n


108

Dataframe.resample () chỉ hoạt động với dữ liệu thời gian. Tôi không thể tìm thấy cách lấy mọi hàng thứ n từ dữ liệu không phải thời gian. phương pháp nào là tốt nhất?

Câu trả lời:


201

Tôi muốn sử dụng iloc, lấy một lát hàng / cột, cả dựa trên vị trí số nguyên và theo cú pháp python bình thường.

df.iloc[::5, :]

46
Đối với những người có thể muốn, ví dụ, mỗi hàng thứ năm, nhưng bắt đầu từ hàng thứ hai thì sẽ như vậy df.iloc[1::5, :].
Little Bobby Tables

17
Bạn có thể bỏ qua phần cột:df.iloc[::5]
joctee 28/12/18

1
@chrisb làm cách nào để chỉ định hàng bắt đầu? như mỗi hàng 5, bắt đầu từ hàng thứ hai?
FabioSpaghetti

30

Mặc dù câu trả lời được chấp nhận của @ chrisb không trả lời được câu hỏi, nhưng tôi muốn thêm vào câu trả lời sau.

Một phương pháp đơn giản tôi sử dụng để lấy nthdữ liệu hoặc giảm nthhàng là như sau:

df1 = df[df.index % 3 != 0]  # Excludes every 3rd row starting from 0
df2 = df[df.index % 3 == 0]  # Selects every 3rd raw starting from 0

Lấy mẫu dựa trên số học này có khả năng cho phép chọn hàng thậm chí phức tạp hơn.

Tất nhiên, điều này giả định rằng bạn có một indexcột gồm các số nguyên có thứ tự, liên tiếp, bắt đầu từ 0.


6
đây không phải là một câu trả lời hay vì đưa ra ba giả định thường không được đáp ứng: (1) chỉ mục là số (2) chỉ số bắt đầu bằng 0 (3) các giá trị chỉ mục liên tiếp nhau ... điều cuối cùng đặc biệt quan trọng kể từ khi bạn không thể sử dụng phương pháp của bạn gợi ý nhiều hơn một lần mà không cần đặt lại chỉ mục
Constantine

1
Tôi hiểu quan điểm của bạn. Sẽ chỉnh sửa câu trả lời để làm cho các giả định rõ ràng hơn .
cănB

1
@Constantine vẫn còn, điều đó sẽ không nhanh hơn giải pháp khác vì bạn có thể chỉ cần thêm một chỉ mục?
Readler

8

Có một giải pháp thậm chí còn đơn giản hơn cho câu trả lời được chấp nhận liên quan đến việc gọi trực tiếp df.__getitem__.

df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

Ví dụ: để có mỗi 2 hàng, bạn có thể làm

df[::2]

   a  b  c
0  x  x  x
2  x  x  x
4  x  x  x

Ngoài ra còn có GroupBy.first/ GroupBy.head, bạn nhóm trên chỉ mục:

df.index // 2
# Int64Index([0, 0, 1, 1, 2], dtype='int64')

df.groupby(df.index // 2).first()
# Alternatively,
# df.groupby(df.index // 2).head(1)

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x

Chỉ số này được chia cho tầng (2, trong trường hợp này). Nếu chỉ mục không phải là số, thay vào đó hãy làm

# df.groupby(np.arange(len(df)) // 2).first()
df.groupby(pd.RangeIndex(len(df)) // 2).first()

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x

1

Tôi đã có một yêu cầu tương tự, nhưng tôi muốn mặt hàng thứ n trong một nhóm cụ thể. Đây là cách tôi giải quyết nó.

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.