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



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



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


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



пробовал



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


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



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

588   11  

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 атрибут, a Index массив. Таким образом, ваш столбец возвращается 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

    Ничего не найдено.