Выбор нескольких столбцов в панды фрейма данных

у меня есть данные в разных столбцах, но я не знаю как извлечь его, чтобы сохранить его в другой переменной.

index  a   b   c
1      2   3   4
2      3   4   5

Как выбрать 'a', 'b' и сохранить его в df1?

пробовал

df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']

кажется, никто не работает.

(Незначительное Редактирование)

11 ответов


имена столбцов (которые являются строками) не могут быть разрезаны так, как вы пытались.

у вас есть несколько вариантов. Если вы знаете из контекста, какие переменные вы хотите вырезать, вы можете просто вернуть представление только этих столбцов, передав список в __getitem__ синтаксис ([] 's).
df1 = df[['a','b']]

альтернативно, если имеет значение индексировать их численно, а не по их имени (скажем, ваш код должен автоматически делать это, не зная имен первых два столбца), то вы можете сделать это вместо этого:

df1 = df.iloc[:,0:2] # Remember that Python does not slice inclusive of the ending index.

кроме того, вы должны ознакомиться с идеей представления в объект Pandas против копии этого объекта. Первый из вышеперечисленных методов вернет новую копию в память нужного подобъекта (нужные срезы).

Иногда, однако, есть соглашения индексирования в панд, которые не делают этого, а вместо этого дают вам новую переменную, которая просто ссылается на тот же кусок памяти, что и подобъект или срез в исходном объекте. Это произойдет со вторым способом индексирования, поэтому вы можете изменить его с помощью copy() функция для получения обычной копии. Когда это происходит, изменение того, что вы считаете разрезанным объектом, иногда может изменить исходный объект. Всегда хорошо быть начеку.

df1 = df.iloc[0,0:2].copy() # To avoid the case where changing df1 also changes df

предполагая, что ваши имена столбцов (df.columns) составляют ['index','a','b','c'], то данные, которые вы хотите в 3-я и 4-я колонки. Если вы не знаете их имена при запуске скрипта, вы можете сделать это

newdf = df[df.columns[2:4]] # Remember, Python is 0-offset! The "3rd" entry is at slot 2.

как указывает EMS в ответ, df.ix ломтики столбцов немного более сжато, но .columns интерфейс нарезки может быть более естественным, потому что он использует синтаксис индексирования/нарезки списка python vanilla 1-D.

предупреждает: 'index' плохое имя для . Эта же метка также используется для real df.index атрибут, a Index массив. Таким образом, ваш столбец возвращается df['index'] и реальный индекс фрейма данных возвращается df.index. Ан Index - это особый вид Series оптимизирован для поиска значений его элементов. Для ДФ.индекс для поиска строк по их этикетке. Это df.columns атрибут также является pd.Index array, для поиска столбцов по их меткам.


начиная с версии 0.11.0, столбцы может быть нарезанный так, как вы пытались использовать .loc индексатор:

df.loc[:, 'C':'E']

columns возвращает C через E.


демо на случайно сгенерированном фрейме данных:

import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)), 
                  columns=list('ABCDEF'), 
                  index=['R{}'.format(i) for i in range(100)])
df.head()

Out: 
     A   B   C   D   E   F
R0  99  78  61  16  73   8
R1  62  27  30  80   7  76
R2  15  53  80  27  44  77
R3  75  65  47  30  84  86
R4  18   9  41  62   1  82

чтобы получить Столбцы от C до E (обратите внимание, что в отличие от целочисленного нарезания, " E " входит в столбцы):

df.loc[:, 'C':'E']

Out: 
      C   D   E
R0   61  16  73
R1   30  80   7
R2   80  27  44
R3   47  30  84
R4   41  62   1
R5    5  58   0
...

то же самое работает для выбора строк на основе меток. Получить строки " R6 " в " R10 " из этих столбцов:

df.loc['R6':'R10', 'C':'E']

Out: 
      C   D   E
R6   51  27  31
R7   83  19  18
R8   11  67  65
R9   78  27  29
R10   7  16  94

.loc также принимает логический массив, поэтому вы можете выбрать столбцы, соответствующая запись которых в массиве True. Например, df.columns.isin(list('BCD')) возвращает array([False, True, True, True, False, False], dtype=bool) - True, если имя столбца находится в списке ['B', 'C', 'D']; false в противном случае.

df.loc[:, df.columns.isin(list('BCD'))]

Out: 
      B   C   D
R0   78  61  16
R1   27  30  80
R2   53  80  27
R3   65  47  30
R4    9  41  62
R5   78   5  58
...

In [39]: df
Out[39]: 
   index  a  b  c
0      1  2  3  4
1      2  3  4  5

In [40]: df1 = df[['b', 'c']]

In [41]: df1
Out[41]: 
   b  c
0  3  4
1  4  5

Я понимаю, что этот вопрос довольно старый, но в последней версии панды есть простой способ сделать именно это. Имена столбцов (которые являются строками) can быть нарезанным любым способом, который вам нравится.

columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)

вы можете предоставить список столбцов для удаления и вернуть фрейм данных только с помощью столбцов, необходимых с помощью drop() функция на фрейме данных Pandas.

просто говорю

colsToDrop = ['a']
df.drop(colsToDrop, axis=1)

вернет фрейм данных только со столбцами b и c.

на drop способ документирован здесь.


Я нашел этот метод очень полезным:

# iloc[row slicing, column slicing]
surveys_df.iloc [0:3, 1:4]

более подробную информацию можно найти здесь


просто использовать: он подберет B и столбце c.

df1=pd.DataFrame()
df1=df[['b','c']]

тогда u может просто вызвать df1:

df1

если вы хотите получить элемент по индексу строки и имени столбца, вы можете сделать это просто как df['b'][0]. Это так просто, как вы можете себе представить.

или вы можете использовать df.ix[0,'b'], смешанное использование индекса и метки.

Примечание: С версии v0.20 ix был осужден в пользу loc / iloc.


различные подходы, обсуждаемые в приведенных выше ответах, основаны на предположении, что либо пользователь знает индексы столбцов для удаления или подмножества, либо пользователь хочет подмножествовать фрейм данных, используя диапазон столбцов (например, между "C": "E"). панды.Фрейм данных.drop (), безусловно, возможность подмножества данных на основе списка столбцов, определенных пользователем (хотя вы должны быть осторожны, что вы всегда используете копию dataframe и на месте параметры не должны установите значение правда!!)

другой вариант-использовать панды.столбцы.разница(), который устанавливает разницу в именах столбцов и возвращает тип индекса массива, содержащего нужные столбцы. Ниже приводится решение:

df = pd.DataFrame([[2,3,4],[3,4,5]],columns=['a','b','c'],index=[1,2])
columns_for_differencing = ['a']
df1 = df.copy()[df.columns.difference(columns_for_differencing)]
print(df1)

выход будет: b c 1 3 4 2 4 5


начиная с 0.21.0, используя .loc или [] со списком с одной или несколькими отсутствующими метками, является устаревшим, в пользу .reindex. Итак, ответ на ваш вопрос:

df1 = df.reindex(columns=['b','c'])

в предыдущих версиях, с помощью .loc[list-of-labels] будет работать до тех пор, пока не будет найден хотя бы 1 из ключей (в противном случае он поднимет KeyError). Это поведение устарело и теперь показывает предупреждающее сообщение. Рекомендуемая альтернатива-использовать .reindex().

подробнее на https://pandas.pydata.org/pandas-docs/stable/indexing.html#reindexing