Як отримати значення з комірки фрейму даних?


345

Я створив умову, яка витягує рівно один рядок із мого кадру даних:

d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)]

Тепер я хотів би взяти значення з певного стовпця:

val = d2['col_name']

Але в результаті я отримую кадр даних, який містить один рядок і один стовпець ( тобто одну комірку). Це не те, що мені потрібно. Мені потрібно одне значення (одне число з плавкою). Як я можу це зробити в пандах?


1
Якщо ви спробували деякі з цих відповідей, але в кінцевому підсумку SettingWithCopyWarning, ви можете ознайомитись з цією публікацією для пояснення попередження та можливих шляхів вирішення / вирішення.
cs95

Відповіді:


428

Якщо у вас є DataFrame лише з одним рядком, тоді перейдіть до першої (лише) рядки як Series, використовуючи iloc, а потім значення, використовуючи ім'я стовпця:

In [3]: sub_df
Out[3]:
          A         B
2 -0.133653 -0.030854

In [4]: sub_df.iloc[0]
Out[4]:
A   -0.133653
B   -0.030854
Name: 2, dtype: float64

In [5]: sub_df.iloc[0]['A']
Out[5]: -0.13365288513107493

1
@ Софолог, дивлячись на це, я поняття не маю. Питання трохи дивно сформульовано, але воно звучить так, що перша половина не має значення для другої. ( atце дійсно приємна відповідь, хоча мені здається дивним, що це так ix:))
Енді Хейден

9
@ Софолог я згоден, що це смішно, що це потрібно. Це також не спрацьовує, коли ви намагаєтеся передати умовні умови в рядок; my_df.loc[my_df['Col1'] == foo]['Col2']як і раніше повертає об’єкт типу<class 'pandas.core.series.Series'>
user5359531

16
Зауважте, що це рішення повертає серію, а не значення!
Atte Juvonen

1
@AtteJuvonen Це залежить від наявності у вашому індексі / стовпцях дублікатів (примітка в / iat викликає виняток із дублікатами стовпців, подасть проблему).
Енді Хайден

1
дивно. Я продовжую читати loc для імен, а iloc - для цілих чисел, але тут я iloc як для цілого числа, так і для імені
mLstudent33

205

Це швидкий доступ для скалярів

In [15]: df = pandas.DataFrame(numpy.random.randn(5,3),columns=list('ABC'))

In [16]: df
Out[16]: 
          A         B         C
0 -0.074172 -0.090626  0.038272
1 -0.128545  0.762088 -0.714816
2  0.201498 -0.734963  0.558397
3  1.563307 -1.186415  0.848246
4  0.205171  0.962514  0.037709

In [17]: df.iat[0,0]
Out[17]: -0.074171888537611502

In [18]: df.at[0,'A']
Out[18]: -0.074171888537611502

9
Мені ця відповідь дуже подобається. Але тоді як ви можете зробити це, .iloc[-1]['A']ви не можете зробити це, at[-1,'A']щоб отримати останній рядок
hartmut

3
це має бути відповіддю, тому що ми не копіюємо в пам'ять непотрібну лінію для отримання лише одного елемента всередині.
бормат

3
@hartmut Ви завжди можете просто зробитиat[df.index[-1],'A']
cs95

105

Ви можете перетворити свій фрейм даних 1x1 у масив numpy, а потім отримати доступ до першого і єдиного значення цього масиву:

val = d2['col_name'].values[0]

10
Будь ласка, поліпшіть якість своєї відповіді за допомогою трохи більше пояснень.
Franck Gamess

Відредагуйте початкову відповідь за допомогою цього, щоб створити коментар. Спасибі
Franck Gamess

2
Я віддаю перевагу цьому методу і використовую його часто. Використовується .get_values()[0]також.
aaronpenne

3
Я думаю, що це найкраща відповідь, оскільки він не повертає pandas.series, і це найпростіший.
Шон Маккарті

Яка перевага у цьому перед методами, які надає Пандас?
AMC

28

Більшість відповідей використовують, ilocщо добре для вибору за позицією.

Якщо вам потрібен вибір за етикеткою, loc було б зручніше.

Отримання явного отримання значення (еквівалентно застарілому df.get_value ('a', 'A'))

# this is also equivalent to df1.at['a','A']
In [55]: df1.loc['a', 'A'] 
Out[55]: 0.13200317033032932

18

Мені потрібно було значення однієї комірки, вибраної іменами стовпців та індексів. Це рішення працювало для мене:

original_conversion_frequency.loc[1,:].values[0]


16

Це виглядає як зміни після панд 10.1 / 13.1

Я оновив з 10,1 до 13,1, раніше iloc не доступний.

Тепер з 13.1, iloc[0]['label']отримує масив єдиного значення, а не скалярний.

Подобається це:

lastprice=stock.iloc[-1]['Close']

Вихід:

date
2014-02-26 118.2
name:Close, dtype: float64

Я думаю, що це має бути лише для Series із дублюючими записами ... насправді, я цього не бачу, чи можете ви навести невеликий приклад, щоб продемонструвати це?
Енді Хайден

Я використав панди 13.x, і iloc [] [] або iloc [,] виводить скаляр. просто iloc не працює з негативним індексом, як -1
timeislove

Якщо ви можете навести іграшковий приклад, демонструючи це у відповіді, це було б дуже корисно!
Енді Хейден

5

Найшвидший / найпростіший варіант, який я знайшов, є наступним. 501 являє собою індекс рядка.

df.at[501,'column_name']
df.get_value(501,'column_name')

5
get_valueзараз застаріло (v0.21.0 RC1 (13 жовтня 2017)) посилання тут .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
Shihe Zhang

4

Для панд 0.10, де ilocце неможливо, відфільтруйте a DFта отримайте дані першого рядка для стовпця VALUE:

df_filt = df[df['C1'] == C1val & df['C2'] == C2val]
result = df_filt.get_value(df_filt.index[0],'VALUE')

якщо відфільтровано більше 1 ряду, отримайте значення першого рядка. Буде виняток, якщо фільтр призведе до порожнього кадру даних.


3
get_valueзараз застаріле (v0.21.0 RC1 (13 жовтня 2017)) посилання тут .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
Shihe Zhang

Але iatабо atне може отримати значення на основі назви стовпця.
sivabudh

4

Не впевнений, чи це хороша практика, але я помітив, що я також можу отримати лише значення, передавши серіал як float.

напр

rate

3 0,042679

Назва: Безробіття_рат, тип: float64

float(rate)

0,0426789


Це також працює з багатоелементною серією?
Пракситель


-1
df_gdp.columns

Індекс ([u'Country ', u'Country Code', u'Indicicator Name ', u'Indicator Code', u'1960 ', u'1961', u'1962 ', u'1963', u'1964 ' , u'1965 ', u'1966', u'1967 ', u'1968', u'1969 ', u'1970', u'1971 ', u'1972', u'1973 ', u'1974' , u'1975 ', u'1976', u'1977 ', u'1978', u'1979 ', u'1980', u'1981 ', u'1982', u'1983 ', u'1984' , u'1985 ', u'1986', u'1987 ', u'1988', u'1989 ', u'1990', u'1991 ', u'1992', u'1993 ', u'1994' , u'1995 ', u'1996', u'1997 ', u'1998', u'1999 ', u'2000',u'2001 ', u'2002', u'2003 ', u'2004', u'2005 ', u'2006', u'2007 ', u'2008', u'2009 ', u'2010', u'2011 ', u'2012', u'2013 ', u'2014', u'2015 ', u'2016'], dtype = 'об'єкт')

df_gdp[df_gdp["Country Code"] == "USA"]["1996"].values[0]

8100000000000.0


4
Це відповідь чи питання?
Вега

4
Ласкаво просимо до переповнення стека! Дякуємо за фрагмент коду, який може надати деяку обмежену, негайну допомогу. Правильне пояснення значно покращило б його довгострокове значення , описавши, чому це хороше рішення проблеми, та зробило б кориснішим майбутнім читачам інші подібні запитання. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи зроблені вами припущення.
sepehr

Незважаючи на негативні голоси, ця відповідь насправді мені допомогла.
CONvid19
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.