पांडा डेटाफ्रेम में स्तंभों का क्रम निर्धारित करें


105

क्या मेरी व्यक्तिगत पसंद (यानी वर्णानुक्रम या संख्यात्मक रूप से क्रमबद्ध नहीं, लेकिन कुछ सम्मेलनों का पालन करना अधिक पसंद है) के आधार पर पंडों के डेटाफ़्रेम में स्तंभों को फिर से लिखने का एक तरीका है?

सरल उदाहरण:

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

इसका उत्पादन करता है:

   one thing other thing  second thing
0          1           a           0.1
1          2           e           0.2
2          3           i           1.0
3          4           o           2.0

लेकिन इसके बजाय, मैं यह चाहूंगा:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

(कृपया, इस मामले के लिए विशिष्ट के बजाय एक सामान्य समाधान प्रदान करें। बहुत धन्यवाद।)

जवाबों:


158

कॉलम नामों में लिखकर बस ऑर्डर खुद चुनें। डबल ब्रैकेट पर ध्यान दें:

frame = frame[['column I want first', 'column I want second'...etc.]]

26
यह केवल इसके बजाय छोटे उदाहरण के साथ काम करता है। यदि आप किसी अन्य स्रोत से, सीएसवी फ़ाइल या डेटाबेस तालिका की तरह डेटा पढ़ रहे हैं, तो आप इस उत्तर का उपयोग नहीं कर सकते। और वे बहुत अधिक सामान्य प्रतीत होते हैं। ओपी ने एक सामान्य समाधान का अनुरोध किया।
संतुष्ट करता है

84

आप इसका उपयोग कर सकते हैं:

columnsTitles = ['onething', 'secondthing', 'otherthing']

frame = frame.reindex(columns=columnsTitles)

6
हालांकि अधिकांश अन्य समाधान अधिक संक्षिप्त हैं, मैं इसे किसी ऐसे व्यक्ति के लिए सबसे अधिक पठनीय मानूंगा जो 100% परिचित नहीं है pandas
डिर्क

3
एक वैरिएबल पर रिटर्न वैल्यू असाइन करना याद रखें, हालांकि यह कॉलम ऑर्डर को इन-प्लेस (कम से कम pandasv0.23` में नहीं ) को संशोधित नहीं करता है ।
डिर्क

सुझाव के लिए धन्यवाद @Dirk
Okroshiashvili

34

यहां एक समाधान है जो मैं अक्सर उपयोग करता हूं। जब आपके पास टन के स्तंभों के साथ एक बड़ा डेटा सेट होता है, तो आप निश्चित रूप से सभी स्तंभों को मैन्युअल रूप से पुनर्व्यवस्थित नहीं करना चाहते हैं।

आप जो कर सकते हैं, और सबसे अधिक संभावना है, करना चाहते हैं कि पहले कुछ कॉलमों को ऑर्डर करें जो आप अक्सर उपयोग करते हैं, और अन्य सभी कॉलमों को सिर्फ अपने लिए दें। यह आर में एक सामान्य दृष्टिकोण है।df %>%select(one, two, three, everything())

इसलिए आप पहले उन कॉलमों को मैन्युअल रूप से टाइप कर सकते हैं जिन्हें आप ऑर्डर करना चाहते हैं और किसी सूची के अन्य सभी कॉलमों से पहले पोस्ट किया जाना है cols_to_order

फिर आप बाकी स्तंभों को मिलाकर नए स्तंभों के लिए एक सूची तैयार करते हैं:

new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())

इसके बाद, आप new_columnsसुझाए गए अन्य समाधानों के रूप में उपयोग कर सकते हैं ।

import pandas as pd
frame = pd.DataFrame({
    'one thing': [1, 2, 3, 4],
    'other thing': ['a', 'e', 'i', 'o'],
    'more things': ['a', 'e', 'i', 'o'],
    'second thing': [0.1, 0.2, 1, 2],
})

cols_to_order = ['one thing', 'second thing']
new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())
frame = frame[new_columns]

   one thing  second thing other thing more things
0          1           0.1           a           a
1          2           0.2           e           e
2          3           1.0           i           i
3          4           2.0           o           o

1
शानदार, परिपूर्ण। मुझे हर कॉलम का नाम या इंडेक्स टाइप करने से रोकने के लिए धन्यवाद
स्टुअर्ट

यह सामान्य उत्तर है और स्वीकृत उत्तर होना चाहिए
कार्लोस

26

आप भी कुछ ऐसा कर सकते थे df = df[['x', 'y', 'a', 'b']]

import pandas as pd
frame = pd.DataFrame({'one thing':[1,2,3,4],'second thing':[0.1,0.2,1,2],'other thing':['a','e','i','o']})
frame = frame[['second thing', 'other thing', 'one thing']]
print frame
   second thing other thing  one thing
0           0.1           a          1
1           0.2           e          2
2           1.0           i          3
3           2.0           o          4

इसके अलावा, आप स्तंभों की सूची प्राप्त कर सकते हैं:

cols = list(df.columns.values)

आउटपुट कुछ इस तरह का उत्पादन करेगा:

['x', 'y', 'a', 'b']

जिसे फिर मैन्युअल रूप से पुनर्व्यवस्थित करना आसान है।


13

एक शब्दकोश के बजाय एक सूची के साथ इसका निर्माण करें

frame = pd.DataFrame([
        [1, .1, 'a'],
        [2, .2, 'e'],
        [3,  1, 'i'],
        [4,  4, 'o']
    ], columns=['one thing', 'second thing', 'other thing'])

frame

   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           4.0           o

मुझे 'कॉलम नाम' नहीं मिल सका: सूची के अंदर काम करने के लिए डेटा जैसा कि यह एक तानाशाही में होता है।
किम मिलर

10

आप ऑर्डरडीड का भी उपयोग कर सकते हैं:

In [183]: from collections import OrderedDict

In [184]: data = OrderedDict()

In [185]: data['one thing'] = [1,2,3,4]

In [186]: data['second thing'] = [0.1,0.2,1,2]

In [187]: data['other thing'] = ['a','e','i','o']

In [188]: frame = pd.DataFrame(data)

In [189]: frame
Out[189]:
   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

6

'कॉलम' पैरामीटर जोड़ें:

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']},
        columns=['one thing', 'second thing', 'other thing']
)

4

अनुक्रमणिका आज़माएं (ताकि आप इसके लिए केवल एक सामान्य समाधान चाहते हैं, इसलिए अनुक्रमणिका क्रम वही हो सकता है जो आप चाहते हैं):

l=[0,2,1] # index order
frame=frame[[frame.columns[i] for i in l]]

अभी:

print(frame)

है:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

-2

मुझे लगता है कि यह सबसे सीधा और काम करने वाला है:

df = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

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