Dataframe.resample () ใช้งานได้กับข้อมูลชุดเวลาเท่านั้น ฉันไม่พบวิธีรับทุกแถวที่ n จากข้อมูลที่ไม่ใช่ชุดเวลา วิธีที่ดีที่สุดคืออะไร?
Dataframe.resample () ใช้งานได้กับข้อมูลชุดเวลาเท่านั้น ฉันไม่พบวิธีรับทุกแถวที่ n จากข้อมูลที่ไม่ใช่ชุดเวลา วิธีที่ดีที่สุดคืออะไร?
คำตอบ:
ฉันจะใช้iloc
ซึ่งรับชิ้นส่วนแถว / คอลัมน์ทั้งตามตำแหน่งจำนวนเต็มและตามไวยากรณ์ python ปกติ
df.iloc[::5, :]
df.iloc[::5]
แม้ว่าคำตอบที่ได้รับการยอมรับของ @ 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
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
ฉันมีข้อกำหนดที่คล้ายกัน แต่ฉันต้องการรายการที่ n ในกลุ่มใดกลุ่มหนึ่ง นี่คือวิธีที่ฉันแก้ไข
groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
วิธีแก้ปัญหาที่ฉันคิดขึ้นเมื่อใช้ดัชนีไม่สามารถทำงานได้ (อาจเป็นไปได้ว่า 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
df.iloc[1::5, :]
มันจะเป็น