получить список из pandas заголовков столбцов dataframe

<p>я хочу получить список заголовков столбцов из pandas dataframe. dataframe будет получен из пользовательского ввода, поэтому я не буду знать, сколько будет столбцов или как они будут называться.</p><p>например, если мне дан dataframe, как это:</p><pre><code>>>> 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 </code></pre><p>я хотел бы получить список, как это:</p><pre><code>>>> header\_list ['y', 'gdp', 'cap'] </code></pre>

<p>вы можете получить значения в виде списка, выполнив:</p><pre><code>list(my\_dataframe.columns.values) </code></pre><p>также вы можете просто использовать:</p><pre><code>list(my\_dataframe) </code></pre>

<p>существует встроенный метод, который наиболее эффективен:</p><pre><code>my\_dataframe.columns.values.tolist() </code></pre><p><code>.columns</code> возвращает <code>index</code>, <code>.columns.values</code> возвращает <code>array</code>, и это имеет вспомогательную функцию для возврата <code>list</code>.</p><p><strong>правка</strong></p><p>для тех, кто ненавидит печатать, возможно, это самый короткий метод:</p><pre><code>list(df) </code></pre>

<p>сделал несколько быстрых тестов, и, возможно, неудивительно, что встроенная версия, использующая <code>dataframe.columns.values.tolist()</code>, является самой быстрой:</p><pre><code>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 </code></pre><p>(мне все еще очень нравится <code>list(dataframe)</code>, так что спасибо edchum!)</p>

<p>это становится еще проще (от pandas 0.16.0): </p><pre><code>df.columns.tolist() </code></pre><p>даст вам имена столбцов в списке nice.</p>

<pre><code>>>> list(my\_dataframe) ['y', 'gdp', 'cap'] </code></pre><p>чтобы вывести список столбцов данных в режиме отладчика, используйте понимание списка:</p><pre><code>>>> [c for c in my\_dataframe] ['y', 'gdp', 'cap'] </code></pre><p>кстати, вы можете получить отсортированный список просто с помощью <code>sorted</code>:</p><pre><code>>>> sorted(my\_dataframe) ['cap', 'gdp', 'y'] </code></pre>

<p>это доступно как <code>my\_dataframe.columns</code>.</p>

<p>это интересно, но <code>df.columns.values.tolist()</code> почти в 3 раза быстрее, чем <code>df.columns.tolist()</code>, но я подумал, что они одинаковы:</p><pre><code>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 </code></pre>

<p>a <a href="https://pandas.pydata.org/pandas-docs/stable/api.html#dataframe">dataframe</a> следует заговорчивому соглашению об итерации «ключей» объектов.</p><pre><code>my\_dataframe.keys() </code></pre><p>создайте список ключей/столбцов - метод объекта <code>to\_list()</code> и pythonic way</p><pre><code>my\_dataframe.keys().to\_list() list(my\_dataframe.keys()) </code></pre><p> <a href="http://pandas.pydata.org/pandas-docs/stable/basics.html#iteration">базовая итерация</a> в dataframe возвращает метки столбцов</p><pre><code>[column for column in my\_dataframe] </code></pre><p>не конвертируйте dataframe в список, просто чтобы получить метки столбцов. не переставайте думать, ища удобные примеры кода.</p><pre class="lang-py prettyprint-override"><code>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) </code></pre>

<h2>в тетради</h2><p>для исследования данных в записной книжке ipython мой предпочтительный способ заключается в следующем:</p><pre><code>sorted(df) </code></pre><p>который будет производить легко читаемый в алфавитном порядке список.</p><h2>в репозитории кода</h2><p>в коде я нахожу это более явным</p><pre><code>df.columns </code></pre><p>потому что он говорит другим, читающим ваш код, что вы делаете.</p>

<p>удивлен, я не видел это опубликовано до сих пор, поэтому я просто оставлю это здесь.</p><h1>расширенная повторяемая распаковка (python3.5 +): <code>[*df]</code> и друзья</h1><p> <a href="https://www.python.org/dev/peps/pep-0448/">распаковка обобщений (pep 448)</a> была введена в python 3.5. итак, следующие операции все возможны.</p><pre><code>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 </code></pre><p>если вы хотите <code>list</code>....</p><pre><code>[*df] # ['a', 'b', 'c'] </code></pre><p>или, если вы хотите <code>set</code>,</p><pre><code>{*df} # {'a', 'b', 'c'} </code></pre><p>или, если вы хотите <code>tuple</code>,</p><pre><code>*df, # please note the trailing comma # ('a', 'b', 'c') </code></pre><p>или, если вы хотите сохранить результат где-то,</p><pre><code>*cols, = df # a wild comma appears, again cols # ['a', 'b', 'c'] </code></pre><p>... если вы тот человек, который превращает кофе в печатание звуков, ну, это будет потреблять ваш кофе более эффективно;)</p><blockquote> <p>п.с .: если производительность важна, вы захотите отказаться от вышеупомянутых решений в пользу</p> <pre><code>df.columns.to\_numpy().tolist() # ['a', 'b', 'c'] </code></pre> <p>это похоже на <a href="https://stackoverflow.com/a/19483602/4909087">ответ эд чума</a> , но обновлено для v0.24, где <code>.to\_numpy()</code> предпочтительнее использования <code>.values</code>. смотрите <a href="https://stackoverflow.com/a/54324513/4909087">этот ответ</a> (мной) для получения дополнительной информации.</p> </blockquote><p><strong> визуальная проверка </strong><br> поскольку я видел, что это обсуждалось в других ответах, вы можете использовать итеративную распаковку (нет необходимости в явных циклах).</p><pre><code>print(*df) a b c print(*df, sep='\n') a b c </code></pre><hr><h1>критика других методов</h1><p>не используйте явный цикл <code>for</code> для операции, которая может быть сделана в одной строке (списки в порядке).</p><p>далее, использование <code>sorted(df)</code><strong> не сохраняет первоначальный порядок </strong>столбцов. для этого вы должны использовать <code>list(df)</code> вместо.</p><p>далее, <code>list(df.columns)</code> и <code>list(df.columns.values)</code> - плохие предложения (в текущей версии v0.24). и <code>index</code> (возвращаемый из <code>df.columns</code>), и массивы numpy (возвращаемые <code>df.columns.values</code>) определяют метод <code>.tolist()</code>, который быстрее и более идиоматичен.</p><p>наконец, listification, т.е. <code>list(df)</code>, следует использовать только в качестве краткой альтернативы вышеупомянутым методам.</p>

<p>как ответил симеон виссер ... вы могли бы сделать</p><pre><code>list(my\_dataframe.columns.values) </code></pre><p>или же </p><pre><code>list(my\_dataframe) # for less typing. </code></pre><p>но я думаю, что самое приятное место это:</p><pre><code>list(my\_dataframe.columns) </code></pre><p>это явно, в то же время не излишне долго.</p>

<p>это дает нам имена столбцов в списке:</p><pre><code>list(my\_dataframe.columns) </code></pre><p>также можно использовать другую функцию с именем tolist ():</p><pre><code>my\_dataframe.columns.tolist() </code></pre>

<p>для быстрой, аккуратной визуальной проверки попробуйте это:</p><pre><code>for col in df.columns: print col </code></pre>

<pre><code>n = [] for i in my\_dataframe.columns: n.append(i) print n </code></pre>

<p>мне кажется, вопрос заслуживает дополнительного объяснения.</p><p>как заметил @fixxxer, ответ зависит от версии pandas, которую вы используете в своем проекте . которую вы можете получить с помощью команды <code>pd.\_\_version\_\_</code>.</p><p>если вы по какой-то причине, как я (в debian jessie, я использую 0.14.1), используете более старую версию панд, чем 0.16.0, тогда вам нужно использовать:</p><p><code>df.keys().tolist()</code>, потому что метод <code>df.columns</code> еще не реализован.</p><p>преимущество этого метода ключей в том, что он работает даже в более новых версиях панд, поэтому он более универсален.</p>

<pre><code>%%timeit final\_df.columns.values.tolist() 948 ns ± 19.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) </code></pre><pre><code>%%timeit list(final\_df.columns) 14.2 µs ± 79.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) </code></pre><pre><code>%%timeit list(final\_df.columns.values) 1.88 µs ± 11.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) </code></pre><pre><code>%%timeit final\_df.columns.tolist() 12.3 µs ± 27.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) </code></pre><pre><code>%%timeit list(final\_df.head(1).columns) 163 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) </code></pre>

<p>несмотря на то, что решение, которое было предоставлено выше, является хорошим. я также ожидал бы, что что-то вроде frame.column\_names () будет функцией в пандах, но, поскольку это не так, может быть, было бы неплохо использовать следующий синтаксис. это каким-то образом сохраняет ощущение, что вы используете панды надлежащим образом, вызывая функцию «tolist»: frame.columns.tolist () </p><pre><code>frame.columns.tolist() </code></pre>

<p>это решение перечисляет все столбцы вашего объекта my\_dataframe:</p><pre><code>print(list(my\_dataframe)) </code></pre>