แพนด้าทุกแถวที่ n


111

Dataframe.resample () ใช้งานได้กับข้อมูลชุดเวลาเท่านั้น ฉันไม่พบวิธีรับทุกแถวที่ n จากข้อมูลที่ไม่ใช่ชุดเวลา วิธีที่ดีที่สุดคืออะไร?

คำตอบ:


211

ฉันจะใช้ilocซึ่งรับชิ้นส่วนแถว / คอลัมน์ทั้งตามตำแหน่งจำนวนเต็มและตามไวยากรณ์ python ปกติ

df.iloc[::5, :]

47
สำหรับผู้ที่อาจต้องการตัวอย่างเช่นทุกแถวที่ห้า แต่เริ่มต้นที่แถวที่ 2 df.iloc[1::5, :]มันจะเป็น
Little Bobby Tables

18
คุณสามารถละเว้นส่วนคอลัมน์:df.iloc[::5]
joctee

1
@chrisb ฉันจะระบุแถวเริ่มต้นได้อย่างไร? เช่นทุกๆ 5 แถวเริ่มจากแถวที่สอง?
FabioSpaghetti

31

แม้ว่าคำตอบที่ได้รับการยอมรับของ @ chrisb จะตอบคำถามได้ แต่ฉันขอเพิ่มสิ่งต่อไปนี้

วิธีง่ายๆที่ฉันใช้เพื่อรับnthข้อมูลหรือวางnthแถวมีดังต่อไปนี้:

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

การสุ่มตัวอย่างตามเลขคณิตนี้มีความสามารถในการเปิดใช้งานการเลือกแถวที่ซับซ้อนยิ่งขึ้น

นี้ถือว่าแน่นอนว่าคุณมีindexคอลัมน์สั่งซื้อติดต่อกันเป็นจำนวนเต็มเริ่มต้นที่ 0


6
นี่ไม่ใช่คำตอบที่ดีเนื่องจากมีสมมติฐานสามข้อซึ่งมักไม่เป็นไปตาม: (1) ดัชนีเป็นตัวเลข (2) ดัชนีเริ่มต้นที่ศูนย์ (3) ค่าดัชนีจะติดต่อกัน ... ข้อสุดท้ายมีความสำคัญอย่างยิ่ง เนื่องจากคุณไม่สามารถใช้วิธีที่แนะนำมากกว่าหนึ่งครั้งโดยไม่ต้องรีเซ็ตดัชนี
คอนสแตนติน

1
ฉันใช้ประเด็นของคุณ จะแก้ไขคำตอบที่จะทำให้สมมติฐานที่ชัดเจนมากขึ้น
metastableB

1
@ คอนสแตนตินยังคงไม่เร็วกว่าโซลูชันอื่นเนื่องจากคุณสามารถเพิ่มดัชนีได้หรือไม่?
Readler

8

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

ตัวอย่างเช่นหากต้องการรับทุกๆ 2 แถวคุณสามารถทำได้

df[::2]

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

นอกจากนี้ยังมีGroupBy.first/ GroupBy.headคุณจัดกลุ่มในดัชนี:

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

ดัชนีถูกแบ่งพื้นด้วยการก้าวย่าง (2 ในกรณีนี้) หากดัชนีไม่ใช่ตัวเลขให้ทำแทน

# 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

ฉันมีข้อกำหนดที่คล้ายกัน แต่ฉันต้องการรายการที่ n ในกลุ่มใดกลุ่มหนึ่ง นี่คือวิธีที่ฉันแก้ไข

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]

0

วิธีแก้ปัญหาที่ฉันคิดขึ้นเมื่อใช้ดัชนีไม่สามารถทำงานได้ (อาจเป็นไปได้ว่า multi-Gig .csv มีขนาดใหญ่เกินไปหรือฉันพลาดเทคนิคบางอย่างที่จะทำให้ฉันสามารถทำดัชนีซ้ำได้โดยไม่เกิดปัญหา)
เดินผ่านทีละแถวและเพิ่มแถวที่ n ลงในดาต้าเฟรมใหม่

import pandas as pd
from csv import DictReader

def make_downsampled_df(filename, interval):    
    with open(filename, 'r') as read_obj:
        csv_dict_reader = DictReader(read_obj)
        column_names = csv_dict_reader.fieldnames
        df = pd.DataFrame(columns=column_names)
    
        for index, row in enumerate(csv_dict_reader):
            if index % interval == 0:
               print(str(row))
               df = df.append(row, ignore_index=True)

    return df
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.