Выбор нескольких столбцов в панды фрейма данных
у меня есть данные в разных столбцах, но я не знаю как извлечь его, чтобы сохранить его в другой переменной.
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 против копии этого объекта. Первый из вышеперечисленных методов вернет новую копию в память нужного подобъекта (нужные срезы).
Иногда, однако, существуют соглашения об индексировании в 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'это плохое имя для a . Эта же метка также используется для реальногоdf.indexатрибут, aIndexмассив. Таким образом, ваш столбец возвращаетсяdf['index']и реальный индекс DataFrame возвращаетсяdf.index. АнIndex- это особый видSeriesоптимизирован для поиска его значений элементов. Для ДФ.индекс для поиска строк по их этикетке. Этоdf.columnsатрибут также являетсяpd.Indexмассив, для поиска столбцов по их этикетки.
начиная с версии 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
Я понимаю, что этот вопрос довольно старый, но в последней версии панды есть простой способ сделать именно это. Имена столбцов (которые являются строками) можете нарезать любым способом, который вам нравится.
columns = ['b', 'c'] df1 = pd.DataFrame(df, columns=columns)
вы можете предоставить список столбцов, которые будут удалены, и вернуть фрейм данных только с помощью столбцов, необходимых с помощью
drop()функция на фрейме данных Pandas.просто говорю
colsToDrop = ['a'] df.drop(colsToDrop, axis=1)вернет фрейм данных только с столбцами
bиc.The
dropспособ документирован здесь.
Я нашел этот метод очень полезным:
# iloc[row slicing, column slicing] surveys_df.iloc [0:3, 1:4]более подробную информацию можно найти здесь
просто использовать: он выберет столбец b и C.
df1=pd.DataFrame() df1=df[['b','c']]затем вы можете просто позвонить df1:
df1
если вы хотите получить элемент по индексу строки и имени столбца, вы можете сделать это просто как
df['b'][0]. Это так просто, как вы можете себе представить.или вы можете использовать
df.ix[0,'b'], смешанное использование индекса и метки.Примечание: начиная с v0. 20
ixбыл осужден в пользуloc/iloc.
различные подходы, обсуждаемые в приведенных выше ответах, основаны на предположении, что либо пользователь знает индексы столбцов для удаления или подмножества, либо пользователь хочет подмножествовать фрейм данных, используя диапазон столбцов (например, между "C": "E"). панды.Фрейм данных.падение() это, конечно, возможность подмножества данных на основе списка столбцов, определенных пользователем (хотя вы должны быть осторожны, что вы всегда используете копию dataframe и inplace параметры не должны установите значение правда!!)
другой вариант-использовать панды.столбцы.разница(), который делает разницу в наборе имен столбцов и возвращает тип индекса массива, содержащего нужные столбцы. Ниже приводится решение:
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]будет работать до тех пор, пока не будет найден хотя бы один из ключей (в противном случае он вызоветKeyError). Это поведение устарело и теперь показывает предупреждающее сообщение. Рекомендуемая альтернатива-использовать.reindex().подробнее на https://pandas.pydata.org/pandas-docs/stable/indexing.html#reindexing
Comments