tutorial - python tabelle darstellen




Wählen Sie Zeilen aus einem Datenrahmen basierend auf Werten in einer Spalte in Pandas aus (8)

Wie wähle ich Zeilen aus einem Datenrahmen basierend auf Werten in einer Spalte in Pandas?
In SQL würde ich verwenden:

select * from table where colume_name = some_value. 

Ich habe versucht, Pandas Dokumentation zu sehen, fand aber nicht sofort die Antwort.


tl; dr

Die Pandas entsprechen

select * from table where column_name = some_value

ist

table[table.column_name == some_value]

Mehrere Bedingungen:

table((table.column_name == some_value) | (table.column_name2 == some_value2))

oder

table.query('column_name == some_value | column_name2 == some_value2')

Codebeispiel

import pandas as pd

# Create data set
d = {'foo':[100, 111, 222], 
     'bar':[333, 444, 555]}
df = pd.DataFrame(d)

# Full dataframe:
df

# Shows:
#    bar   foo 
# 0  333   100
# 1  444   111
# 2  555   222

# Output only the row(s) in df where foo is 222:
df[df.foo == 222]

# Shows:
#    bar  foo
# 2  555  222

In dem obigen Code ist es die Zeile df[df.foo == 222] , die die Zeilen basierend auf dem Spaltenwert df[df.foo == 222] , 222 in diesem Fall.

Mehrere Bedingungen sind ebenfalls möglich:

df[(df.foo == 222) | (df.bar == 444)]
#    bar  foo
# 1  444  111
# 2  555  222

Aber an dieser Stelle würde ich empfehlen, die query verwenden, da sie weniger ausführlich ist und das gleiche Ergebnis liefert:

df.query('foo == 222 | bar == 444')

An diese berühmte Frage anhängen (wenn auch etwas zu spät): Sie können auch df.groupby('column_name').get_group('column_desired_value').reset_index() , um einen neuen df.groupby('column_name').get_group('column_desired_value').reset_index() mit einer bestimmten Spalte mit einem bestimmten Wert zu erstellen . Z.B

import pandas as pd
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split()})
print("Original dataframe:")
print(df)

b_is_two_dataframe = pd.DataFrame(df.groupby('B').get_group('two').reset_index()).drop('index', axis = 1) 
#NOTE: the final drop is to remove the extra index column returned by groupby object
print('Sub dataframe where B is two:')
print(b_is_two_dataframe)

Führen Sie dies aus:

Original dataframe:
     A      B
0  foo    one
1  bar    one
2  foo    two
3  bar  three
4  foo    two
5  bar    two
6  foo    one
7  foo  three
Sub dataframe where B is two:
     A    B
0  foo  two
1  foo  two
2  bar  two

Hier ist ein einfaches Beispiel

from pandas import DataFrame

# Create data set
d = {'Revenue':[100,111,222], 
     'Cost':[333,444,555]}
df = DataFrame(d)


# mask = Return True when the value in column "Revenue" is equal to 111
mask = df['Revenue'] == 111

print mask

# Result:
# 0    False
# 1     True
# 2    False
# Name: Revenue, dtype: bool


# Select * FROM df WHERE Revenue = 111
df[mask]

# Result:
#    Cost    Revenue
# 1  444     111

Ich finde die Syntax der vorherigen Antworten redundant und schwer zu merken. Pandas haben die Methode query() in v0.13 eingeführt und ich bevorzuge sie sehr. Für Ihre Frage könnten Sie df.query('col == val')

Reproduziert von http://pandas.pydata.org/pandas-docs/version/0.17.0/indexing.html#indexing-query

In [167]: n = 10

In [168]: df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc'))

In [169]: df
Out[169]: 
          a         b         c
0  0.687704  0.582314  0.281645
1  0.250846  0.610021  0.420121
2  0.624328  0.401816  0.932146
3  0.011763  0.022921  0.244186
4  0.590198  0.325680  0.890392
5  0.598892  0.296424  0.007312
6  0.634625  0.803069  0.123872
7  0.924168  0.325076  0.303746
8  0.116822  0.364564  0.454607
9  0.986142  0.751953  0.561512

# pure python
In [170]: df[(df.a < df.b) & (df.b < df.c)]
Out[170]: 
          a         b         c
3  0.011763  0.022921  0.244186
8  0.116822  0.364564  0.454607

# query
In [171]: df.query('(a < b) & (b < c)')
Out[171]: 
          a         b         c
3  0.011763  0.022921  0.244186
8  0.116822  0.364564  0.454607

Sie können auch auf Variablen in der Umgebung zugreifen, indem Sie ein @ voranstellen.

exclude = ('red', 'orange')
df.query('color not in @exclude')

Schnellere Ergebnisse können mit numpy.where erzielt werden.

Zum Beispiel mit unubtus Setup -

In [76]: df.iloc[np.where(df.A.values=='foo')]
Out[76]: 
     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

Zeitvergleiche:

In [68]: %timeit df.iloc[np.where(df.A.values=='foo')]  # fastest
1000 loops, best of 3: 380 µs per loop

In [69]: %timeit df.loc[df['A'] == 'foo']
1000 loops, best of 3: 745 µs per loop

In [71]: %timeit df.loc[df['A'].isin(['foo'])]
1000 loops, best of 3: 562 µs per loop

In [72]: %timeit df[df.A=='foo']
1000 loops, best of 3: 796 µs per loop

In [74]: %timeit df.query('(A=="foo")')  # slowest
1000 loops, best of 3: 1.71 ms per loop

Um Zeilen auszuwählen, deren Spaltenwert einem Skalar, some_value , some_value , verwenden Sie == :

df.loc[df['column_name'] == some_value]

Um Zeilen auszuwählen, deren Spaltenwert sich in einem some_values , verwenden Sie isin :

df.loc[df['column_name'].isin(some_values)]

Kombiniere mehrere Bedingungen mit & :

df.loc[(df['column_name'] == some_value) & df['other_column'].isin(some_values)]

Um Zeilen zu wählen, deren Spaltenwert nicht gleich some_value , verwenden Sie != :

df.loc[df['column_name'] != some_value]

isin gibt eine boolesche Reihe zurück. isin also Zeilen auszuwählen, deren Wert nicht in some_values , some_values die boolesche Reihe mit ~ :

df.loc[~df['column_name'].isin(some_values)]

Beispielsweise,

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
#      A      B  C   D
# 0  foo    one  0   0
# 1  bar    one  1   2
# 2  foo    two  2   4
# 3  bar  three  3   6
# 4  foo    two  4   8
# 5  bar    two  5  10
# 6  foo    one  6  12
# 7  foo  three  7  14

print(df.loc[df['A'] == 'foo'])

Erträge

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

Wenn Sie mehrere Werte haben, die Sie einschließen möchten, isin Sie sie in eine Liste (oder allgemeiner, alle iterierbaren) ein und verwenden Sie isin :

print(df.loc[df['B'].isin(['one','three'])])

Erträge

     A      B  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14

Beachten Sie jedoch, dass es effizienter ist, zuerst einen Index zu df.loc und dann df.loc , wenn Sie dies mehrmals tun df.loc :

df = df.set_index(['B'])
print(df.loc['one'])

Erträge

       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12

oder, um mehrere Werte aus dem Index aufzunehmen, verwenden Sie df.index.isin :

df.loc[df.index.isin(['one','two'])]

Erträge

       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12

Wenn Sie hierher gekommen sind, um Zeilen aus einem Datenrahmen auszuwählen, indem Sie diejenigen einschließen, deren Spaltenwert KEINE Werte enthält, können Sie die Antwort von unutbu wie folgt umblättern:

df.loc[~df['column_name'].isin(some_values)]

(Um keinen einzelnen Wert anzugeben, verwenden Sie natürlich nur den regulären Operator != ).

Beispiel:

import pandas as pd
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split()})
print(df)

gibt uns

     A      B
0  foo    one
1  bar    one
2  foo    two
3  bar  three
4  foo    two
5  bar    two
6  foo    one
7  foo  three    

Um nur die Zeilen zu unterteilen, die NICHT one oder three in Spalte B :

df.loc[~df['B'].isin(['one', 'three'])]

Erträge

     A    B
2  foo  two
4  foo  two
5  bar  two

df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8), 'D': np.arange(8) * 2})
df[df['A']=='foo']

OUTPUT:
   A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14




dataframe