पांडा से सूची प्राप्त करें DataFrame कॉलम हेडर


1013

मैं पंडों DataFrame से कॉलम हेडर की एक सूची प्राप्त करना चाहता हूं। DataFrame उपयोगकर्ता इनपुट से आएगा इसलिए मुझे नहीं पता होगा कि वहाँ कितने कॉलम होंगे या उन्हें क्या कहा जाएगा।

उदाहरण के लिए, अगर मुझे इस तरह से एक DataFrame दिया जाता है:

>>> my_dataframe
    y  gdp  cap
0   1    2    5
1   2    3    9
2   8    7    2
3   3    4    7
4   6    7    7
5   4    8    3
6   8    2    8
7   9    9   10
8   6    6    4
9  10   10    7

मैं इस तरह की एक सूची प्राप्त करना चाहता हूं:

>>> header_list
['y', 'gdp', 'cap']

जवाबों:


1644

आप मानों को एक सूची के रूप में प्राप्त कर सकते हैं:

list(my_dataframe.columns.values)

इसके अलावा, आप बस का उपयोग कर सकते हैं: ( एड चुम के जवाब में दिखाया गया है ):

list(my_dataframe)

42
इस डॉकcolumns में एक विशेषता के रूप में क्यों नहीं है ?
तजोर्रीमोर्री

@Tjorriemorrie: मुझे यकीन नहीं है, यह उस तरह से करना पड़ सकता है जब वे स्वचालित रूप से अपने प्रलेखन उत्पन्न करते हैं। हालांकि अन्य स्थानों पर इसका उल्लेख है: pandas.pydata.org/pandas-docs/stable/…
शिमोन

8
मुझे कुछ उम्मीद होती df.column_names()। क्या यह जवाब अभी भी सही है या यह पुराना है?
अल्व्स

1
@alvas करने के लिए कई अन्य तरीके हैं (इस पृष्ठ पर अन्य उत्तर देखें) लेकिन जहां तक ​​मुझे पता है कि सूची बनाने के लिए डेटाफ़्रेम पर सीधे तौर पर कोई विधि नहीं है।
शिमोन विसर

19
महत्वपूर्ण रूप से, यह कॉलम ऑर्डर को संरक्षित करता है।
विंडचाइम्स

402

एक बिल्ट इन मेथड है जो सबसे अधिक प्रदर्शन करने वाला है:

my_dataframe.columns.values.tolist()

.columnsएक इंडेक्स .columns.valuesदेता है , एक सरणी देता है और इसमें एक सहायक कार्य होता है.tolist एक सूची वापस करने के लिए होता है।

यदि प्रदर्शन आपके लिए उतना महत्वपूर्ण नहीं है, तो Indexऑब्जेक्ट एक ऐसी .tolist()विधि को परिभाषित करते हैं जिसे आप सीधे कॉल कर सकते हैं:

my_dataframe.columns.tolist()

प्रदर्शन में अंतर स्पष्ट है:

%timeit df.columns.tolist()
16.7 µs ± 317 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit df.columns.values.tolist()
1.24 µs ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

जो लोग टाइपिंग नफरत के लिए, आप बस फोन कर सकते हैं listपर df, इतनी के रूप में:

list(df)

4
वोट डाउन नहीं किया, लेकिन समझाना चाहते हैं: कार्यान्वयन विवरणों पर भरोसा न करें, डेटाफ़्रेम के "सार्वजनिक इंटरफ़ेस" का उपयोग करें। Df.keys () की सुंदरता के बारे में सोचें
साशा

3
@SaschaGottfried का क्रियान्वयन DataFrameएक दिन से नहीं बदला है: pandas.pydata.org/pandas-docs/stable/basics.html#iteration । DataFrame से लौटाए जाने योग्य चलने वाला स्तंभ हमेशा से ही स्तंभ रहा है, इसलिए for col in df:हमेशा ऐसा ही व्यवहार करना चाहिए जब तक कि डेवलपर्स के पास मेलडाउन न हो और तब list(df)भी एक वैध तरीका होना चाहिए। ध्यान दें कि df.keys()स्तंभों की कुंजी रखने वाली तानाशाही जैसी संरचना के आंतरिक कार्यान्वयन में कॉल कर रहे हैं।
नगण्य डाउनवोट

मैं columnsविशेषता के कार्यान्वयन विवरण का उल्लेख कर रहा था । एक घंटे पहले मैंने लॉ ऑफ़ डेमेटर के बारे में पढ़ा था जिसमें कहा गया था कि कॉलर को आंतरिक ऑब्जेक्ट मॉडल को नेविगेट करने पर निर्भर नहीं होना चाहिए। list(df)स्पष्ट प्रकार रूपांतरण करता है। उल्लेखनीय दुष्प्रभाव: डेटाफ्रेम आकार df.keys()विधि के साथ निष्पादन का समय और मेमोरी की खपत , ए की तानाशाही जैसी प्रकृति का हिस्सा है DataFrame। उल्लेखनीय तथ्य: df.keys()डेटाफ़्रेम आकार की परवाह किए बिना निष्पादन समय स्थिर है - पांडा डेवलपर्स की जिम्मेदारी का हिस्सा।
साशा गॉटफ्रीड

1
@SaschaGottfried मैं इसे अपने जवाब और क्रेडिट में जोड़ सकता हूं, जिसे आप किसी और के रूप में देख रहे हैं, इसमें शामिल नहीं है
EdChum

1
मैं दिए गए उत्तर में और साथ ही टिप्पणियों में मूल्य देख सकता हूं - कुछ भी बदलने की आवश्यकता नहीं है।
साशा गॉटफ्रीड

89

कुछ त्वरित परीक्षण किए, और शायद अनजाने में निर्मित संस्करण का उपयोग dataframe.columns.values.tolist()सबसे तेज है:

In [1]: %timeit [column for column in df]
1000 loops, best of 3: 81.6 µs per loop

In [2]: %timeit df.columns.values.tolist()
10000 loops, best of 3: 16.1 µs per loop

In [3]: %timeit list(df)
10000 loops, best of 3: 44.9 µs per loop

In [4]: % timeit list(df.columns.values)
10000 loops, best of 3: 38.4 µs per loop

(मैं अभी भी वास्तव में पसंद है list(dataframe), इसलिए धन्यवाद EdChum!)


47

यह और भी सरल हो जाता है (पांडा 0.16.0 द्वारा):

df.columns.tolist()

आपको एक अच्छी सूची में कॉलम नाम देगा।


37
>>> list(my_dataframe)
['y', 'gdp', 'cap']

डीबगर मोड में डेटाफ़्रेम के स्तंभों को सूचीबद्ध करने के लिए, सूची समझ का उपयोग करें:

>>> [c for c in my_dataframe]
['y', 'gdp', 'cap']

वैसे, आप केवल उपयोग करके एक क्रमबद्ध सूची प्राप्त कर सकते हैं sorted:

>>> sorted(my_dataframe)
['cap', 'gdp', 'y']

यह list(df)केवल autoincrement डेटाफ्रेम के साथ काम करेगा ? या यह सभी डेटाफ्रेम के लिए काम करता है?
अल्व्स

2
सभी के लिए काम करना चाहिए। जब आप डिबगर में होते हैं, हालांकि, आपको एक सूची समझ का उपयोग करने की आवश्यकता होती है [c for c in df]
अलेक्जेंडर

25

हैरानी की बात है कि मैंने इसे अब तक पोस्ट नहीं किया है, इसलिए मैं इसे यहां छोड़ दूंगा।

विस्तारित Iterable अनपैकिंग (python3.5 +): [*df]और मित्र

पाइथन 3.5 के साथ अनपैकेजिंग जेनरेशन (PEP 448) पेश किया गया है। तो, निम्नलिखित ऑपरेशन सभी संभव हैं।

df = pd.DataFrame('x', columns=['A', 'B', 'C'], index=range(5))
df

   A  B  C
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x 

अगर तुम चाहो तो list…।

[*df]
# ['A', 'B', 'C']

या, यदि आप चाहते हैं set,

{*df}
# {'A', 'B', 'C'}

या, यदि आप चाहते हैं ए tuple,

*df,  # Please note the trailing comma
# ('A', 'B', 'C')

या, यदि आप परिणाम को कहीं स्टोर करना चाहते हैं,

*cols, = df  # A wild comma appears, again
cols
# ['A', 'B', 'C']

... यदि आप उस तरह के व्यक्ति हैं जो कॉफी को टाइपिंग ध्वनियों में परिवर्तित करता है, ठीक है, यह आपके कॉफी को अधिक कुशलता से खपत करता है;)

पुनश्च: यदि प्रदर्शन महत्वपूर्ण है, तो आप ऊपर दिए गए समाधानों को अपने पक्ष में करना चाहेंगे

df.columns.to_numpy().tolist()
# ['A', 'B', 'C']

यह एड चुम के उत्तर के समान है , लेकिन v0.24 के लिए अद्यतन किया जाता है, जहां .to_numpy()के उपयोग को प्राथमिकता दी जाती है .values। देखें क्या यह उत्तर में अधिक जानकारी के लिए (मेरे द्वारा)।

दृश्य की जाँच करें
जब से मैंने इसे अन्य उत्तरों में चर्चा करते हुए देखा है, आप पुनरावृत्त अनपैकिंग (स्पष्ट छोरों की कोई आवश्यकता नहीं) का उपयोग कर सकते हैं।

print(*df)
A B C

print(*df, sep='\n')
A
B
C

अन्य तरीकों की आलोचना

एक स्पष्ट उपयोग न करें forएक ऑपरेशन के लिए लूप का एक पंक्ति में किया जा सकता है (सूची समझ ठीक है)।

अगला, उपयोग करना स्तंभों sorted(df) के मूल क्रम को संरक्षित नहीं करता है । उसके लिए, आपको उपयोग करना चाहिएlist(df) इसके बजाय ।

अगला, list(df.columns)और list(df.columns.values)खराब सुझाव हैं (वर्तमान संस्करण के रूप में, v0.24)। दोनों Index( df.columnsऔर से लौटे ) और NumPy सरणियाँ (द्वारा लौटी df.columns.values) परिभाषित करती हैं.tolist() विधि है जो तेज और अधिक मुहावरेदार है।

अन्त में, सूचीकरण अर्थात्, list(df)केवल अजगर के लिए उपरोक्त विधियों के संक्षिप्त विकल्प के रूप में उपयोग किया जाना चाहिए <= 3.4 जहाँ विस्तारित अनपैकिंग उपलब्ध नहीं है।


24

के रूप में उपलब्ध है my_dataframe.columns


1
और स्पष्ट रूप से एक सूची के रूप मेंheader_list = list(my_dataframe.columns)
yeliabsalohcin

^ या बेहतर अभी भी df.columns.tolist():।
cs95

18

यह दिलचस्प है, लेकिन df.columns.values.tolist()लगभग 3 गुना तेज है, df.columns.tolist()लेकिन मुझे लगा कि वे समान हैं:

In [97]: %timeit df.columns.values.tolist()
100000 loops, best of 3: 2.97 µs per loop

In [98]: %timeit df.columns.tolist()
10000 loops, best of 3: 9.67 µs per loop

2
इस उत्तर में समय पहले ही कवर किया जा चुका है । विसंगति का कारण यह .valuesहै कि अंतर्निहित सुन्न सरणी लौटाता है, और सुन्न के साथ कुछ करना लगभग हमेशा पंडों के साथ सीधे काम करने की तुलना में तेजी से होता है।
cs95

17

एक DataFrame वस्तुओं की "कुंजी" पर पुनरावृति के तानाशाह की तरह सम्मेलन का अनुसरण करता है।

my_dataframe.keys()

कुंजियों / स्तंभों की एक सूची बनाएं - ऑब्जेक्ट विधि to_list()और पायथोनिक तरीका

my_dataframe.keys().to_list()
list(my_dataframe.keys())

एक DataFrame रिटर्न कॉलम लेबल पर मूल पुनरावृत्ति

[column for column in my_dataframe]

एक DataFrame को सूची में न बदलें, सिर्फ कॉलम लेबल प्राप्त करने के लिए। सुविधाजनक कोड नमूनों की तलाश करते समय सोचना बंद न करें।

xlarge = pd.DataFrame(np.arange(100000000).reshape(10000,10000))
list(xlarge) #compute time and memory consumption depend on dataframe size - O(N)
list(xlarge.keys()) #constant time operation - O(1)

2
मेरा परीक्षण शो df.columnsकी तुलना में बहुत तेज है df.keys()। निश्चित नहीं है कि उनके पास एक ही चीज़ के लिए एक फ़ंक्शन और विशेषता दोनों क्यों है (ठीक है, यह पहली बार नहीं है जब मैंने 10 अलग-अलग तरीकों से पांडा में कुछ करने के लिए देखा है)।
cs95

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

14

नोटबुक में

IPython नोटबुक में डेटा की खोज के लिए, मेरा पसंदीदा तरीका यह है:

sorted(df)

जो वर्णानुक्रम से क्रमबद्ध सूची को पढ़ने के लिए एक आसान उत्पादन करेगा।

एक कोड भंडार में

कोड में मुझे ऐसा करना अधिक स्पष्ट लगता है

df.columns

क्योंकि यह आपके कोड को पढ़ने वाले अन्य लोगों को बताता है कि आप क्या कर रहे हैं।


sorted(df)क्रम बदलता है। सावधानी से प्रयोग करें।
cs95

@coldspeed मैं इसका उल्लेख करता हूं, हालांकि "जो वर्णानुक्रम में सूचीबद्ध सूची को पढ़ने में आसान होगा।"
फायरलैक्सएक्स

9
%%timeit
final_df.columns.values.tolist()
948 ns ± 19.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeit
list(final_df.columns)
14.2 µs ± 79.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
list(final_df.columns.values)
1.88 µs ± 11.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeit
final_df.columns.tolist()
12.3 µs ± 27.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
list(final_df.head(1).columns)
163 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

3

जैसा कि शिमोन विज़र ने उत्तर दिया था ... आप कर सकते थे

list(my_dataframe.columns.values) 

या

list(my_dataframe) # for less typing.

लेकिन मुझे लगता है कि सबसे प्यारी जगह है:

list(my_dataframe.columns)

यह स्पष्ट है, एक ही समय में अनावश्यक रूप से लंबा नहीं है।


"यह स्पष्ट है, एक ही समय में अनावश्यक रूप से लंबा नहीं है।" मैं असहमत हूं। कॉलिंग listकी कोई योग्यता नहीं है जब तक कि आप इसे dfसीधे (उदाहरण के लिए, संक्षिप्तता) नहीं कह रहे हों । .columnsविशेषता को एक्सेस करना एक ऐसी Indexवस्तु को लौटाता है, जिस पर एक tolist()विधि परिभाषित होती है, और यह कॉल करना सूची को सूचीबद्ध करने से अधिक मुहावरेदार होता है Index। पूर्णता की खातिर मुहावरों का मिश्रण एक महान विचार नहीं है। उसी सरणी को सूचीबद्ध करने के लिए जाता है जिसे आप प्राप्त करते हैं .values
cs95


3

यह हमें सूची में कॉलम का नाम देता है:

list(my_dataframe.columns)

एक अन्य फ़ंक्शन जिसे टोस्ट () कहा जाता है, का उपयोग किया जा सकता है:

my_dataframe.columns.tolist()

यह पहले से ही अन्य उत्तरों में शामिल किया गया है। आपका पहला समाधान भी मुहावरों को मिलाता है, जो एक महान विचार नहीं है। एक अन्य उत्तर के तहत मेरी टिप्पणी देखें ।
cs95

2

मुझे लगता है कि सवाल अतिरिक्त स्पष्टीकरण के हकदार हैं।

जैसा कि @fixxxer ने कहा, इसका जवाब आपके प्रोजेक्ट में उपयोग किए जा रहे पांडा संस्करण पर निर्भर करता है। जिसे आप pd.__version__कमांड से प्राप्त कर सकते हैं ।

यदि आप मेरे जैसे किसी कारण से हैं (डेबियन जेसी पर मैं 0.14.1 का उपयोग करता हूं) 0.16.0 से पुराने संस्करण का उपयोग करते हुए, तो आपको उपयोग करने की आवश्यकता है:

df.keys().tolist()क्योंकि df.columnsअभी तक कोई विधि लागू नहीं हुई है।

इस कुंजी विधि का लाभ यह है कि यह पांडा के नए संस्करण में भी काम करता है, इसलिए यह अधिक सार्वभौमिक है।


कीज़ () की विशेषता यह है कि यह एक विशेषता देखने के बजाय एक फ़ंक्शन कॉल है, इसलिए यह हमेशा धीमा रहने वाला है। बेशक, लगातार समय के साथ, कोई भी वास्तव में इन जैसे मतभेदों के बारे में परवाह नहीं करता है, लेकिन मुझे लगता है कि यह वैसे भी उल्लेख के लायक है; df.columns अब हेडर एक्सेस करने के लिए एक अधिक सार्वभौमिक रूप से स्वीकृत मुहावरा है।
cs95

1
n = []
for i in my_dataframe.columns:
    n.append(i)
print n

6
कृपया इसे सूची बोध से बदलें।
साशा गॉटफ्रीड

4
अपनी पहली 3 पंक्तियों को बदल दें[n for n in dataframe.columns]
एंटोन प्रोतोपोपोव

आप एक ऑपरेशन के लिए इस सारी परेशानी से क्यों गुजरना चाहेंगे जो आप आसानी से एक लाइन में कर सकते हैं?
cs95

0

हालांकि जो समाधान ऊपर प्रदान किया गया था वह अच्छा है। मैं भी कुछ उम्मीद करूंगा कि फ्रेम। कोलमुन_नाम () पंडों में एक फंक्शन होगा, लेकिन चूंकि यह नहीं है, इसलिए निम्नलिखित सिंटैक्स का उपयोग करना अच्छा होगा। यह किसी भी तरह से उस भावना को संरक्षित करता है जिसे आप "टोस्ट" फ़ंक्शन को कॉल करके एक उचित तरीके से पांडा का उपयोग कर रहे हैं: फ्रेम ।columns.tolist ()

frame.columns.tolist() 

0

अगर DataFrame में एक Index या MultiIndex होता है और आप उन लोगों को कॉलम नाम के रूप में शामिल करना चाहते हैं:

names = list(filter(None, df.index.names + df.columns.values.tolist()))

यह कॉल करने से बचता है reset_index () जिसमें इस तरह के एक सरल ऑपरेशन के लिए अनावश्यक प्रदर्शन होता है।

मुझे इसकी अधिक आवश्यकता है, क्योंकि मैं डेटाबेस से डेटा को बंद कर रहा हूं जहां डेटाफ्रेम इंडेक्स मैप्स को एक प्राथमिक / अद्वितीय कुंजी के रूप में प्रदर्शित करता है, लेकिन वास्तव में मेरे लिए एक और "कॉलम" है। यह शायद पांडा के लिए इस तरह से कुछ के लिए एक बिल्ट-इन विधि है (पूरी तरह से संभव है कि मैं इसे याद किया है) है।


-1

यह समाधान आपके ऑब्जेक्ट my_dataframe के सभी कॉलमों को सूचीबद्ध करता है:

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