2016-06-09 7 views
6

यह प्रश्न का एक अनुवर्ती प्रश्न है जिसे मैंने here से पूछा था। वहां मैंने सीखा) कॉलम के लिए यह कैसे करें (नीचे देखें) और बी) कि पंक्तियों और स्तंभों का चयन आर में काफी अलग तरीके से संभाला जाता है जिसका अर्थ है कि मैं पंक्तियों के लिए एक ही दृष्टिकोण का उपयोग नहीं कर सकता।नामों के आधार पर कॉलम और पंक्तियों की एक श्रृंखला का चयन करके और अनुक्रमणिका में नहीं, डेटाफ्रेम का टुकड़ा कैसे करें?

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randint(10, size=(6, 6)), 
        columns=['c' + str(i) for i in range(6)], 
        index=["r" + str(i) for i in range(6)]) 

    c0 c1 c2 c3 c4 c5 
r0 4 2 3 9 9 0 
r1 9 0 8 1 7 5 
r2 2 6 7 5 4 7 
r3 6 9 9 1 3 4 
r4 1 1 1 3 0 3 
r5 0 8 5 8 2 9 

तो मैं आसानी से इस तरह पंक्तियों और स्तंभों उनके नाम से चुन सकते हैं::

print df.loc['r3':'r5', 'c1':'c4'] 

जो रिटर्न

c1 c2 c3 c4 
r3 9 9 1 3 
r4 1 1 3 0 
r5 8 5 8 2 

तो मैं इस तरह एक पांडा dataframe है लगता है

मैं आर में यह कैसे करूँगा? इस

df <- data.frame(c1=1:6, c2=2:7, c3=3:8, c4=4:9, c5=5:10, c6=6:11) 
rownames(df) <- c('r1', 'r2', 'r3', 'r4', 'r5', 'r6') 

    c1 c2 c3 c4 c5 c6 
r1 1 2 3 4 5 6 
r2 2 3 4 5 6 7 
r3 3 4 5 6 7 8 
r4 4 5 6 7 8 9 
r5 5 6 7 8 9 10 
r6 6 7 8 9 10 11 

जाहिर है की तरह एक dataframe को देखते हुए, अगर मैं अपने वांछित पंक्तियां/स्तंभ की अनुक्रमणिका पता है, मैं बस कर सकते हैं:

df[3:5, 1:4] 

लेकिन मैं पंक्तियां हटाना हो सकता है/इतना है कि अपने विश्लेषण के दौरान कॉलम मैं सूचकांक की तुलना में नाम से चुनना चाहूंगा। लिंक से ऊपर मुझे पता चला कि स्तंभों के लिए निम्नलिखित काम करेगा:

subset(df, select=c1:c4) 

जो

c1 c2 c3 c4 
r1 1 2 3 4 
r2 2 3 4 5 
r3 3 4 5 6 
r4 4 5 6 7 
r5 5 6 7 8 
r6 6 7 8 9 

रिटर्न लेकिन कैसे मैं भी एक ही समय में नाम से पंक्तियों की श्रेणी का चयन कर सकता है?

इस विशेष मामले में मैं निश्चित रूप से grep का उपयोग कर सकता हूं लेकिन मनमाना नामों वाले स्तंभों के बारे में कैसे?

और मैं

df[c('r3', 'r4' 'r5'), c('c1','c2', 'c3', 'c4')] 

लेकिन एक वास्तविक टुकड़ा का उपयोग नहीं करना चाहते हैं।

उत्तर

6

आप rownames साथ which() उपयोग कर सकते हैं:

subset(df[which(rownames(df)=='r3'):which(rownames(df)=='r5'),], select=c1:c4) 


    c1 c2 c3 c4 
r3 3 4 5 6 
r4 4 5 6 7 
r5 5 6 7 8 
+0

हाँ, मैं चाहिए अधिक सटीक (मेरे प्रश्न को संपादित करेंगे): यह डब्ल्यू होना चाहिए मनमाने ढंग से नाम के लिए ओर्क; उन लोगों को वास्तव में पार्स करना आसान होगा :) – Cleb

+0

ठीक है मैंने इसे पहले बहुत जल्दी पढ़ा है। क्या यही तुम्हें चाहिए था? – HubertL

+0

बढ़िया! हाँ, यह ठीक काम करता है।मैं इसे अभी अपवित्र करता हूं और बाद में इसे अन्य उत्तरों की गुणवत्ता के आधार पर स्वीकार करता हूं। – Cleb

2

उपयोग match विशेष पंक्ति नामों की स्थिति का पता लगाने के लिए।

df[match("r3", rownames(df)):match("r5", rownames(df)), match("c1", colnames(df)):match("c4", colnames(df))] 

    c1 c2 c3 c4 
r3 3 4 5 6 
r4 4 5 6 7 
r5 5 6 7 8 
+0

लेकिन फिर मुझे उन पंक्तियों और स्तंभों को निर्दिष्ट करने की आवश्यकता है जो मैं वास्तव में टालना चाहता हूं (मैंने यह स्पष्ट करने के लिए अपना प्रश्न संपादित किया है); बस इसे 100 पंक्तियों/कॉलम के लिए कल्पना करें जिन्हें आप चुनना चाहते हैं ... – Cleb

+0

कृपया मेरे परिवर्तनों की जांच करें। क्या यह आपके लिए काम करेगा? – milan

+0

हां, यह भी काम करता है, ऊपर (ऊपर)! आपको बस 'index.c' में टाइपो को ठीक करने की आवश्यकता है। – Cleb

3

आप एक समारोह है कि थोड़े आप एक ही व्यवहार

'%:%' <- function(object, range) { 
    FUN <- if (!is.null(dim(object))) { 
    if (is.matrix(object)) colnames else names 
    } else identity 
    wh <- if (is.numeric(range)) range else which(FUN(object) %in% range) 
    FUN(object)[seq(wh[1], wh[2])] 
} 

df <- data.frame(c1=1:6, c2=2:7, c3=3:8, c4=4:9, c5=5:10, c6=6:11) 
rownames(df) <- c('r1', 'r2', 'r3', 'r4', 'r5', 'r6') 

तरह

df %:% c('c2', 'c4') 
# [1] "c2" "c3" "c4" 

rownames(df) %:% c('r2', 'r4') 
# [1] "r2" "r3" "r4" 

इसका इस्तेमाल अपने प्रश्न के लिए दे देंगे लिख सकते हैं

df[rownames(df) %:% c('r3', 'r5'), df %:% c('c1', 'c5')] 
# c1 c2 c3 c4 c5 
# r3 3 4 5 6 7 
# r4 4 5 6 7 8 
# r5 5 6 7 8 9 
संबंधित मुद्दे

 संबंधित मुद्दे