การเลือกแถวแบบสุ่มใน Pandaframe Pandas


159

มีวิธีเลือกสุ่มแถวจาก DataFrame ใน Pandas หรือไม่

ใน R ใช้แพ็คเกจรถยนต์มีฟังก์ชั่นที่มีประโยชน์some(x, n)ซึ่งคล้ายกับ head แต่เลือกในตัวอย่างนี้ 10 แถวที่สุ่มจาก x

ฉันยังดูเอกสารการแบ่งส่วนและดูเหมือนจะไม่มีอะไรเทียบเท่า

ปรับปรุง

ตอนนี้ใช้เวอร์ชั่น 20 มีวิธีตัวอย่างอยู่

df.sample(n)


1
df.sample(N, replace=True)หากคุณกำลังมองหาตัวอย่างที่มีขนาดที่มากขึ้นกว่าเดิมการใช้งาน รายละเอียดเพิ่มเติมที่นี่
cs95

คำตอบ:


57

อะไรแบบนี้?

import random

def some(x, n):
    return x.ix[random.sample(x.index, n)]

หมายเหตุ:ในฐานะของนุ่น v0.20.0, ix ได้รับการคัดค้านในความโปรดปรานของlocสำหรับการทำดัชนีตามฉลาก


8
ขอบคุณ @eumiro ฉันยังทำงานจากที่df.ix[np.random.random_integers(0, len(df), 10)]จะทำงาน
จอห์น

7
หากคุณต้องการใช้ numpy df.ix[np.random.choice(df.index, 10)]แล้วคุณยังสามารถทำ
naught101

7
บางคนในโพสต์อื่น ๆ กล่าวถึงว่าnp.random.choiceเร็วเป็นสองเท่าrandom.sample
Phani

5
หากคุณใช้ np.random.choice คุณต้องระบุ replace = False มิฉะนั้นคุณจะได้แถวที่ซ้ำกัน!
stmax

2
ฉันคิดว่า ".ix" เลิกใช้แล้วและคุณควรใช้. loc สำหรับการจัดทำดัชนีตามป้ายกำกับ
compguy24

266

ด้วยเวอร์ชันแพนด้า0.16.1ขึ้นไปขณะนี้มีDataFrame.sample วิธีการในตัว :

import pandas

df = pandas.DataFrame(pandas.np.random.random(100))

# Randomly sample 70% of your dataframe
df_percent = df.sample(frac=0.7)

# Randomly sample 7 elements from your dataframe
df_elements = df.sample(n=7)

สำหรับวิธีการด้านบนทั้งสองคุณสามารถรับส่วนที่เหลือของแถวโดยทำ:

df_rest = df.loc[~df.index.isin(df_percent.index)]

df_0.7ไม่ใช่ชื่อที่ถูกต้อง นอกจากนี้ผมขอแนะนำให้เปลี่ยนด้วยdf_rest = df.loc[~df.index.isin(df_0_7.index)] df_rest = df.loc[df.index.difference(df_0_7.index)]
Pietro Battiston

@PietroBattiston ขอบคุณ ฉันพยายามทำให้คำตอบชัดเจนขึ้น แต่ฉันเห็นด้วยกับตัวอย่างที่ไม่ทำงานไม่ชัดเจน ดีกับเคล็ดลับในความแตกต่าง แม้ว่าฉันยังต้องการเขียนการแบ่งเพื่อให้ฉันอ่านเป็นดัชนี "ไม่ได้อยู่ในดัชนีตัวอย่างของฉัน" มีการเพิ่มประสิทธิภาพด้วยdifference()หรือไม่
ryanjdillon

1
@ryanjdillon มีการพิมพ์ผิดที่เหลืออยู่ฉันแก้ไขมัน เกี่ยวกับวิธีการนี้ฉันจะนำข้อเสนอแนะกลับมาใช้จริงเพราะจริง ๆ แล้วมันมีประสิทธิภาพน้อยกว่าเล็กน้อย df_percent.index.get_indexer(df.index) == -1อยู่ไกลที่มีประสิทธิภาพแทน ( แต่ยังน่าเกลียดมากขึ้น) เพิ่มเติม ...
Pietro Battiston

18

sample

ในฐานะของ v0.20.0 คุณสามารถใช้pd.DataFrame.sampleซึ่งสามารถใช้เพื่อส่งกลับตัวอย่างสุ่มของแถวจำนวนคงที่หรือเปอร์เซ็นต์ของแถว:

df = df.sample(n=k)     # k rows
df = df.sample(frac=k)  # int(len(df.index) * k) rows

สำหรับการทำสำเนาคุณสามารถระบุจำนวนเต็มrandom_state, np.ramdom.seedเทียบเท่ากับการใช้ ตัวอย่างเช่นแทนที่จะตั้งค่าnp.random.seed = 0คุณสามารถ:

df = df.sample(n=k, random_state=0)

7

วิธีที่ดีที่สุดในการทำเช่นนี้คือฟังก์ชั่นตัวอย่างจากโมดูลสุ่ม

import numpy as np
import pandas as pd
from random import sample

# given data frame df

# create random index
rindex =  np.array(sample(xrange(len(df)), 10))

# get 10 random rows from df
dfr = df.ix[rindex]

4

จริงนี้จะทำให้คุณทำซ้ำดัชนีnp.random.random_integers(0, len(df), N)ที่Nเป็นจำนวนมาก


3

บรรทัดด้านล่างจะสุ่มเลือกจำนวน n แถวจากจำนวนแถวที่มีอยู่ทั้งหมดจาก dataframe df โดยไม่มีการแทนที่

df=df.take(np.random.permutation(len(df))[:n])

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