745 Stimmen

Wie kann ich den Wert aus einer Zelle eines Dataframes erhalten?

Ich habe eine Bedingung erstellt, die genau eine Zeile aus meinem DataFrame extrahiert:

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

Jetzt möchte ich einen Wert aus einer bestimmten Spalte nehmen:

val = d2['col_name']

Aber als Ergebnis erhalte ich einen DataFrame, der eine Zeile und eine Spalte enthält (d.h. eine Zelle). Das ist nicht das, was ich brauche. Ich brauche einen Wert (eine Gleitkommazahl). Wie kann ich das in pandas machen?

8voto

Michael Wei Punkte 81

Ich bin mir nicht sicher, ob dies eine gute Praxis ist, aber ich habe bemerkt, dass ich den Wert auch einfach erhalten kann, indem ich die Serie als float umwandle.

Zum Beispiel,

rate

3 0.042679

Name: Arbeitslosenquote, dtype: float64

float(rate)

0.0426789

8voto

not a robot Punkte 3525

Wenn eine einzelne Zeile aus einem DataFrame gefiltert wurde, besteht eine Möglichkeit, einen skalaren Wert aus einer einzelnen Zelle zu erhalten, darin, squeeze() (oder item()) zu verwenden:

df = pd.DataFrame({'A':range(5), 'B': range(5)})
d2 = df[df['A'].le(5) & df['B'].eq(3)]
val = d2['A'].squeeze()                 # 3

val = d2['A'].item()                    # 3

Tatsächlich kann item() auch auf den Index angewendet werden, daher könnte die Kombination aus item + at funktionieren.

msk = df['A'].le(5) & df['B'].eq(3)
val = df.at[df.index[msk].item(), 'B']  # 3

Tatsächlich ist die letztere Methode viel schneller als jede andere hier aufgeführte Methode, um einen einzelnen Zellenwert zu erhalten.

df = pd.DataFrame({'A':range(10000), 'B': range(10000)})
msk = df['A'].le(5) & df['B'].eq(3)

%timeit df.at[df.index[msk].item(), 'A']
# 31,4 µs ± 5,83 µs pro Durchlauf (Mittelwert ± Standardabweichung von 7 Durchläufen, 10.000 Durchläufe pro Durchlauf)
%timeit df.loc[msk, 'A'].squeeze()
# 143 µs ± 8,99 µs pro Durchlauf (Mittelwert ± Standardabweichung von 7 Durchläufen, 10.000 Durchläufe pro Durchlauf)
%timeit df.loc[msk, 'A'].item()
# 125 µs ± 1,56 µs pro Durchlauf (Mittelwert ± Standardabweichung von 7 Durchläufen, 10.000 Durchläufe pro Durchlauf)
%timeit df.loc[msk, 'A'].iat[0]
# 125 µs ± 1,96 µs pro Durchlauf (Mittelwert ± Standardabweichung von 7 Durchläufen, 10.000 Durchläufe pro Durchlauf)
%timeit df[msk]['A'].values[0]
# 189 µs ± 8,67 µs pro Durchlauf (Mittelwert ± Standardabweichung von 7 Durchläufen, 10.000 Durchläufe pro Durchlauf)

7voto

tyersome Punkte 180

Ich bin auf dies gestoßen, als ich Dataframes mit MultiIndexes verwendet habe und fand squeeze nützlich.

Aus der Dokumentation:

Drückt eindimensionale Achsenobjekte zu Skalaren zusammen.

Series oder DataFrames mit einem einzigen Element werden zu einem Skalar zusammengepresst. DataFrames mit einer einzelnen Spalte oder einer einzigen Zeile werden zu einer Series zusammengepresst. Andernfalls bleibt das Objekt unverändert.

# Beispiel für einen Dataframe mit MultiIndex
> import pandas as pd

> df = pd.DataFrame(
                    [
                        [1, 2, 3],
                        [4, 5, 6],
                        [7, 8, 9]
                    ],
                    index=pd.MultiIndex.from_tuples( [('i', 1), ('ii', 2), ('iii', 3)] ),
                    columns=pd.MultiIndex.from_tuples( [('A', 'a'), ('B', 'b'), ('C', 'c')] )
)

> df
       A  B  C
       a  b  c
i   1  1  2  3
ii  2  4  5  6
iii 3  7  8  9

> df.loc['ii', 'B']
   b
2  5

> df.loc['ii', 'B'].squeeze()
5

Zu beachten ist, dass während df.at[] auch funktioniert (wenn Sie keine Bedingungen verwenden müssen), müssen Sie meines Wissens nach dennoch alle Ebenen des MultiIndex angeben.

Beispiel:

> df.at[('ii', 2), ('B', 'b')]
5

Ich habe einen DataFrame mit einem sechsstufigen Index und zweistufigen Spalten, daher ist es recht hilfreich, nur die äußere Ebene angeben zu müssen.

6voto

Sergey Sergienko Punkte 365

Für pandas 0.10, wo iloc nicht verfügbar ist, filtern Sie ein DF und erhalten Sie die Daten der ersten Zeile für die Spalte VALUE:

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

Wenn mehr als eine Zeile gefiltert wird, wird der Wert der ersten Zeile erhalten. Es wird eine Ausnahme auftreten, wenn das Filterergebnis zu einem leeren Datenrahmen führt.

5voto

Shaig Hamzaliyev Punkte 179

Das Konvertieren in einen Integer hat bei mir funktioniert, aber wenn Sie einen Float benötigen, ist es auch einfach:

int(sub_df.iloc[0])

für einen Float-Wert:

float(sub_df.iloc[0])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X