पंडों हर nth पंक्ति


108

Dataframe.resample () केवल समय डेटा के साथ काम करता है। मैं गैर-समय डेटा से प्रत्येक nth पंक्ति प्राप्त करने का एक तरीका नहीं खोज सकता। सबसे अच्छा तरीका क्या है?

जवाबों:


201

मैं उपयोग करूँगा iloc, जो पूर्णांक स्थिति और सामान्य पायथन सिंटैक्स के आधार पर एक पंक्ति / स्तंभ टुकड़ा दोनों लेता है।

df.iloc[::5, :]

46
उदाहरण के लिए, जो चाहते हैं, हर पांचवीं पंक्ति के लिए, लेकिन दूसरी पंक्ति से शुरू होगा df.iloc[1::5, :]
लिटिल बॉबी टेबल्स

17
आप कॉलम भाग को छोड़ सकते हैं:df.iloc[::5]
joctee

1
@chrisb मैं आरंभिक पंक्ति कैसे निर्दिष्ट करूँ? हर 5 पंक्ति की तरह, दूसरी पंक्ति से शुरू?
FabioSpaghetti

30

हालाँकि @ 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

यह अंकगणित आधारित नमूनाकरण और भी अधिक जटिल पंक्ति-चयन को सक्षम करने की क्षमता रखता है।

यह मानता है , निश्चित रूप से, आपके पास 0 से शुरू होने वाले , निरंतर, पूर्णांकोंindex का एक स्तंभ है ।


6
यह एक अच्छा जवाब नहीं है क्योंकि तीन धारणाएं बनाता है, जो अक्सर नहीं मिलते हैं: (1) सूचकांक संख्यात्मक है (2) यह सूचकांक शून्य पर शुरू होता है (3) सूचकांक मान लगातार होते हैं ... अंतिम एक विशेष रूप से महत्वपूर्ण है चूँकि आप अपने सुझाए गए तरीके को इंडेक्स
कॉन्स्टेंटाइन

1
मैं आपकी बात मानता हूँ। मान्यताओं को और अधिक स्पष्ट करने के लिए उत्तर को संपादित करेंगे ।
metastableB

1
@ कॉन्सटेंटाइन अभी भी, अन्य समाधान की तुलना में तेज़ नहीं होगा क्योंकि आप बस एक इंडेक्स जोड़ सकते हैं?
पाठक

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'th आइटम चाहता था। इस तरह मैंने इसे हल किया।

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.