पूर्णांक सूचकांक द्वारा पांडा श्रृंखला / डेटाफ़्रेम की एक पंक्ति का चयन करना


395

मैं क्यों जानने के लिए उत्सुक हूँ df[2], समर्थित नहीं है, जबकि df.ix[2]और df[2:3]दोनों काम करते हैं।

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

मैं अजगर के अनुक्रमण सम्मेलन के अनुरूप होने के df[2]लिए उसी तरह काम करने की उम्मीद करूंगा df[2:3]। क्या एकल पूर्णांक द्वारा अनुक्रमण पंक्ति का समर्थन नहीं करने का एक डिज़ाइन कारण है?


4
df.ix[2]काम नहीं करता है - कम से कम नहींpandas version '0.19.2'
ज़हरा

9
अनुक्रमणिका ऑपरेटर के माध्यम से पंक्ति और स्तंभ चयन के बीच अंतर देखने के लिए [], नीचे इस उत्तर को देखें । इसके अलावा कभी नहीं .ix, यह पदावनत है
टेड पेट्रो

जवाबों:


551

@HYRY की गूंज, नए डॉक्स को 0.11 में देखें

http://pandas.pydata.org/pandas-docs/stable/indexing.html

यहां हमारे पास नए ऑपरेटर हैं, .ilocकेवल पूर्णांक अनुक्रमणिका की खोज का .locसमर्थन करने के लिए , और केवल लेबल अनुक्रमणिका की खोज का समर्थन करने के लिए

उदाहरण के लिए इस परिदृश्य की कल्पना करें

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] केवल पंक्तियों (लेबल स्थान द्वारा) को स्लाइस करता है


7
क्या होगा यदि आप दूसरी और तीसरी और चौथी पंक्ति चाहते हैं?
फफूंदी

1
आप बस इंडेक्सर्स की सूची पास कर सकते हैं; डॉक्स ऊपर बताए गए हैं
जेफ

2
क्या किसी के पास इन नामों का औचित्य है? मुझे ये याद रखना मुश्किल है क्योंकि मुझे यकीन नहीं है कि ilocपंक्तियाँ और locलेबल क्यों हैं।
किलोजूल

3
@kilojoules .ilocइंडेक्स में अपने ऑर्डर से चीजों को देखता है (जैसे .iloc[[2]]) दूसरी "पंक्ति" है df। यह पंक्ति इंडेक्स लोकेशन पर होती है4.locउनके सूचकांक मूल्य द्वारा उन्हें देखता है। तो शायद "इलोक" "आई" की तरह है A[i]? :)
जिम के।

1
@ जेफ़ - यह बहुत अच्छा काम करता है, लेकिन तब क्या होता है जब आप अपने डेटा फ्रेम से एक पंक्ति की नकल करना चाहते हैं, जैसे कि df.loc[-1] = df.iloc[[0]], और वह डालें? फ़्रेम त्रुटि देने वाले एक अतिरिक्त सूचकांक कॉलम के साथ आता है ValueError: cannot set a row with mismatched columns (देखें stackoverflow.com/questions/47340571/… )
ग्रोपर

63

DataFrame अनुक्रमण ऑपरेटर का प्राथमिक उद्देश्य, []स्तंभों का चयन करना है।

जब इंडेक्सिंग ऑपरेटर को एक स्ट्रिंग या पूर्णांक पास किया जाता है, तो यह उस विशेष नाम के साथ एक कॉलम खोजने का प्रयास करता है और इसे एक श्रृंखला के रूप में वापस करता है।

तो, ऊपर दिए df[2]गए प्रश्न में: पूर्णांक मान से मेल खाते स्तंभ नाम की खोज करता है 2। यह कॉलम मौजूद नहीं है और ए KeyErrorउठा हुआ है।


डेटाफ्रेम इंडेक्सिंग ऑपरेटर स्लाइस नोटेशन का उपयोग करने पर पंक्तियों का चयन करने के लिए व्यवहार को पूरी तरह से बदल देता है

अजीब बात है, जब एक टुकड़ा दिया जाता है, तो DataFrame अनुक्रमण ऑपरेटर पंक्तियों का चयन करता है और ऐसा पूर्णांक स्थान या अनुक्रमणिका लेबल द्वारा कर सकता है।

df[2:3]

यह पंक्ति से शुरुआत पूर्णांक स्थान 2 से 3 तक होगा, जो अंतिम तत्व से अनन्य है। तो, बस एक पंक्ति। निम्नलिखित पूर्णांक स्थान पर 6 पंक्तियों का चयन करता है, लेकिन हर तीसरी पंक्ति में 20 शामिल नहीं है।

df[6:20:3]

यदि आपके DataFrame अनुक्रमणिका में तार हैं, तो आप स्ट्रिंग लेबलों से बने स्लाइस का भी उपयोग कर सकते हैं। अधिक जानकारी के लिए, .iloc बनाम .loc पर इस समाधान को देखें ।

मैं लगभग अनुक्रमण संचालक के साथ इस स्लाइस नोटेशन का उपयोग कभी नहीं करता हूं क्योंकि यह स्पष्ट नहीं है और शायद ही कभी इस्तेमाल किया गया हो। जब कतारों से काटते हैं, तो चिपकते हैं .loc/.iloc


इंडेक्सिंग ऑपरेटर का उपयोग करके किसी अन्य डेटाफ्रेम में पंक्तियों को जोड़ने की कोशिश की जा रही है लेकिन अन्य डेटाफ्रेम खाली है। क्यों?
FindOutIslamNow

23

आप DataFrame को Series का एक तानाशाह मान सकते हैं। एक श्रृंखला ऑब्जेक्ट df[key]द्वारा कॉलम इंडेक्स का चयन करने का प्रयास करें key

हालाँकि [] के अंदर स्लाइस करना, पंक्तियों को स्लाइस करता है, क्योंकि यह एक बहुत ही सामान्य ऑपरेशन है।

आप दस्तावेज़ को विस्तार से पढ़ सकते हैं:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics


संकेत के लिए धन्यवाद। मज़ेदार, इस तरह की बात अभी भी कई बार सवालिया निशान खड़ा करती है। कुछ स्थितियों में व्यवहार के अपवादों को जोड़कर .. मुझे लगता है कि थोड़ी सुविधा के लिए निरंतरता का त्याग करना पसंद है।
कार्ल बर्गर

15

पंडों की तालिका में अनुक्रमणिका-आधारित पहुंच के लिए, कोई भी तालिका को Numpy सरणी में बदलने के लिए numpy.as_array विकल्प पर विचार कर सकता है

np_df = df.as_matrix()

और फिर

np_df[i] 

काम करेगा।


11
वह डेटाफ्रेम इंडेक्स के पूरे उद्देश्य को हरा देता है और बाकी सब पंडों को प्रदान करता है
फाबियो डायस

6

आप स्रोत कोड पर एक नज़र डाल सकते हैं ।

DataFrame_slice()टुकड़ा करने के लिए एक निजी कार्य है DataFrame, और यह पैरामीटर axisको यह निर्धारित करने की अनुमति देता है कि किस अक्ष को टुकड़ा करना है। के __getitem__()लिए DataFrameअक्ष सेट नहीं है, जबकि आह्वान _slice()। तो _slice()यह डिफ़ॉल्ट अक्ष 0 से टुकड़ा।

आप एक सरल प्रयोग कर सकते हैं, जो आपकी मदद कर सकता है:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)

5

आप इस तरह से डेटा फ्रेम के माध्यम से लूप कर सकते हैं।

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.