Hoe krijg ik een waarde uit een cel van een dataframe?

Ik heb een voorwaarde geconstrueerd die precies één rij extraheert uit mijn dataframe:

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

Nu wil ik een waarde uit een bepaalde kolom nemen:

val = d2['col_name']

Maar als resultaat krijg ik een dataframe dat één rij en één kolom bevat (d.w.z.één cel). Het is niet wat ik nodig heb. Ik heb één waarde nodig (één float-nummer). Hoe kan ik het in panda’s doen?


Antwoord 1, autoriteit 100%

Als je een DataFrame hebt met slechts één rij, ga dan naar de eerste (enige) rij als een serie met ilocen vervolgens de waarde met de kolomnaam:

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

Antwoord 2, autoriteit 47%

Dit zijn snelle toegang voor scalars

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

Antwoord 3, autoriteit 28%

U kunt uw 1×1-dataframe in een Numpy-array veranderen en vervolgens op de eerste en enige waarde van die array:

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

Antwoord 4, Autoriteit 5%

De meeste antwoorden gebruiken ilocdie goed is voor selectie op positie.

Als u selectie-by-label loczou handiger zijn.

Voor het uitdrukkelijk een waarde krijgen (equiv to verouderd
df.get_value (‘A’, ‘A’)

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

Antwoord 5, Autoriteit 4%

Ik had de waarde van één cel nodig, geselecteerd op kolom- en indexnamen.
Deze oplossing werkte voor mij:

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


Antwoord 6, Autoriteit 4%

Het hoeft niet ingewikkeld te zijn:

val = df.loc[df.wd==1, 'col_name'].values[0]

Antwoord 7, Autoriteit 3%

Het lijkt op veranderingen na Panda’s 10.1 / 13.1

Ik heb een upgrade van 10.1 naar 13.1, voordat ILOC niet beschikbaar is.

Nu met 13.1, iloc[0]['label']krijgt een enkele waarde-array in plaats van een scalaire.

Zoals dit:

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

Uitgang:

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

Antwoord 8, Autoriteit 2%

De snelste/gemakkelijkste opties die ik heb gevonden zijn de volgende. 501 vertegenwoordigt de rij-index.

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

Antwoord 9

Ik weet niet zeker of dit een goede gewoonte is, maar ik heb gemerkt dat ik ook alleen de waarde kan krijgen door de serie te casten als float.

bijv.

rate

3 0,042679

Naam: Unemployment_rate, dtype: float64

float(rate)

0.0426789


Antwoord 10

Voor panda’s 0.10, waarbij ilocniet beschikbaar is, filtert u een DFen haalt u de eerste rijgegevens op voor de kolom VALUE:

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

als er meer dan 1 rij is gefilterd, verkrijg dan de waarde van de eerste rij. Er zal een uitzondering zijn als het filter resulteert in een leeg gegevensframe.


Antwoord 11

df_gdp.columns

Index([u’Land’, u’Landcode’, u’Indicatornaam’, u’Indicatorcode’,
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 = ‘Object’)

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

8100000000000.0


Antwoord 12

het converteren naar integer werkte voor mij:

int(sub_df.iloc[0])

Antwoord 13

Om de waarde van de volledige rij als JSON (in plaats van een serie) te krijgen:

row = df.iloc[0]

Gebruik de to_jsonmethode zoals hieronder:

row.to_json()

Other episodes