पंडों डेटाफ्रेम में यादृच्छिक पंक्ति चयन


159

क्या पंडों में डेटाफ़्रेम से यादृच्छिक पंक्तियों का चयन करने का एक तरीका है।

आर में, कार पैकेज का उपयोग करते हुए, एक उपयोगी फ़ंक्शन है some(x, n)जो सिर के समान है लेकिन चयन करता है, इस उदाहरण में, x से यादृच्छिक पर 10 पंक्तियाँ।

मैंने स्लाइसिंग डॉक्यूमेंटेशन को भी देखा है और लगता है कि कुछ भी नहीं के बराबर है।

अपडेट करें

अब संस्करण 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
यदि आप सुन्न का उपयोग करना चाहते हैं, तो आप भी कर सकते हैं df.ix[np.random.choice(df.index, 10)]
n

7
किसी अन्य पोस्ट में किसी ने उल्लेख किया है कि np.random.choiceदो बार के रूप में तेजी से हैrandom.sample
फानी

5
यदि आप np.random.choice का उपयोग करते हैं, तो आपको प्रतिस्थापित = गलत निर्दिष्ट करना होगा, अन्यथा आपको डुप्लिकेट पंक्तियाँ मिलेंगी!
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)]
पिएत्रो बैटिस्टन

@PietroBattiston धन्यवाद। मैं उत्तर को स्पष्ट करने का प्रयास कर रहा था, लेकिन मैं मानता हूं कि एक गैर-कार्यशील उदाहरण स्पष्ट नहीं है। अंतर पर टिप के साथ अच्छा लगा। हालांकि, मैं अभी भी स्लाइस लिखना पसंद करता हूं ताकि मैं इसे "मेरे नमूने के सूचकांक में नहीं" सूचकांकों के रूप में पढ़ूं। क्या प्रदर्शन में वृद्धि हुई है difference()?
ryanjdillon

1
@ryanjdillon शेष टाइपो था, मैंने इसे ठीक किया। विधि के बारे में, मैं वास्तव में अपना सुझाव वापस ले रहा हूं, क्योंकि वास्तव में यह थोड़ा कम कुशल है। df_percent.index.get_indexer(df.index) == -1इसके बजाय कहीं अधिक कुशल है (लेकिन और भी बदसूरत है) ...
पिएत्रो बैटिस्टन

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 संख्या पंक्तियों का चयन करेगी।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.