Câu trả lời:
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, :]
df.iloc[::5]
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 nth
dữ liệu hoặc giảm nth
hà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 index
cột gồm các số nguyên có thứ tự, liên tiếp, bắt đầu từ 0.
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
df.iloc[1::5, :]
.