Как получить значение из Pandas DataFrame, а не индекс и тип объекта


104

Скажем, у меня есть следующий DataFrame

Буквенный номер
А 1
БИ 2
C 3
D 4

Что можно получить с помощью следующего кода

import pandas as pd

letters=pd.Series(('A', 'B', 'C', 'D'))
numbers=pd.Series((1, 2, 3, 4))
keys=('Letters', 'Numbers')
df=pd.concat((letters, numbers), axis=1, keys=keys)

Теперь я хочу получить значение C из столбца Letters.

Командная строка

df[df.Letters=='C'].Letters

вернется

2 С
Имя: Буквы, dtype: объект

Как я могу получить только значение C, а не весь двухстрочный вывод?


6
Кстати, есть более удобный способ сконструировать DataFrame:pd.DataFrame({'Letters': letters, 'Numbers': numbers})
ДжоКондрон,

Ответы:


144
df[df.Letters=='C'].Letters.item()

Это возвращает первый элемент в индексе / серии, возвращенный из этого выбора. В этом случае значение всегда является первым элементом.

РЕДАКТИРОВАТЬ:

Или вы можете запустить loc () и таким образом получить доступ к первому элементу. Это было короче, и я реализовал это в прошлом.


2
Мне нравится этот метод, но я получаю предупреждение:FutureWarning: "item" has been deprecated and will be removed in a future version
AlexG

2
@AlexG: вы можете использовать вместо этого: df[df.Letters=='C'].Letters.iloc[0]. Он создает первый элемент (который также является уникальным) в ряду результатов.
Anh-Thi DINH

при использовании loc [: 1] рядом со значением по-прежнему отображается индекс :(
Sonic Soul

@AlexG и @Sonic Soul: попробуйте использовать df[df.Letters=='C'].Letters.squeeze()вместо этого. Это работает точно так же. :)
user78910

52

Используйте valuesатрибут, чтобы вернуть значения в виде массива np, а затем используйте [0]для получения первого значения:

In [4]:
df.loc[df.Letters=='C','Letters'].values[0]

Out[4]:
'C'

РЕДАКТИРОВАТЬ

Лично я предпочитаю обращаться к столбцам с помощью операторов индекса:

df.loc[df['Letters'] == 'C', 'Letters'].values[0]

Это позволяет избежать проблем, когда в именах столбцов могут быть пробелы или дефисы, -что означает доступ к using ..


1
Я лично не использую .для доступа к столбцам, так как это не всегда сработает, например, если имя столбца начинается с числового значения или в имени столбца есть не буквенные символы, такие как пробел, поэтому я всегда предпочитаюdf['col_name']
EdChum

Понимаю. Поэтому куда бы я ни посмотрел, я всегда находил df['col_name']обозначения вместо .обозначений. Еще раз спасибо.
Эдуардо

1
Это действительно несущественно, но при выборе вы получаете доступ к столбцу «Буквы», используя точечную нотацию; df.loc [df.Letters == 'C']. Если в именах столбцов есть пробелы, вам, вероятно, следует использовать конвертеры для их удаления, как если бы вы выполняли импорт из файла CSV или Excel.
valkn0t

@ thomas-ato Я обновлю свой ответ, но я не согласен с модификацией столбцов в качестве дополнительного шага, если в этом нет необходимости, в этом случае я согласен, что это не имеет значения
EdChum

1
import pandas as pd

dataset = pd.read_csv("data.csv")
values = list(x for x in dataset["column name"])

>>> values[0]
'item_0'

редактировать:

фактически, вы можете просто проиндексировать набор данных, как любой старый массив.

import pandas as pd

dataset = pd.read_csv("data.csv")
first_value = dataset["column name"][0]

>>> print(first_value)
'item_0'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.