it-swarm.com.de

Vergleichen Sie zwei Spalten mit Pandas

Verwenden Sie dies als Ausgangspunkt:

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

Out[8]: 
  one  two three
0   10  1.2   4.2
1   15  70   0.03
2    8   5     0

Ich möchte etwas wie eine if-Anweisung in Pandas verwenden. 

if df['one'] >= df['two'] and df['one'] <= df['three']:
    df['que'] = df['one']

Überprüfen Sie grundsätzlich jede Zeile mit der if-Anweisung. Erstellen Sie eine neue Spalte. 

Die Dokumente sagen .all, aber es gibt kein Beispiel ...

36
Merlin

Sie könnten np.where verwenden. Wenn cond ein boolesches Array ist und A und B Arrays sind, dann

C = np.where(cond, A, B)

definiert, dass C gleich A ist, wobei cond True ist, und B, wobei cond False ist.

import numpy as np
import pandas as pd

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three'])
                     , df['one'], np.nan)

erträge

  one  two three  que
0  10  1.2   4.2   10
1  15   70  0.03  NaN
2   8    5     0  NaN

Wenn Sie mehr als eine Bedingung haben, können Sie stattdessen np.select verwenden Wenn Sie beispielsweise möchten, dass df['que'] gleich df['two'] ist, wenn df['one'] < df['two'], dann

conditions = [
    (df['one'] >= df['two']) & (df['one'] <= df['three']), 
    df['one'] < df['two']]

choices = [df['one'], df['two']]

df['que'] = np.select(conditions, choices, default=np.nan)

erträge

  one  two three  que
0  10  1.2   4.2   10
1  15   70  0.03   70
2   8    5     0  NaN

Wenn wir davon ausgehen können, dass df['one'] >= df['two'] wenn df['one'] < df['two'] False ist, könnten die Bedingungen und Auswahlmöglichkeiten vereinfacht werden

conditions = [
    df['one'] < df['two'],
    df['one'] <= df['three']]

choices = [df['two'], df['one']]

(Die Annahme trifft möglicherweise nicht zu, wenn df['one'] oder df['two'] NaNs enthalten.)


Beachten Sie, dass 

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

definiert einen DataFrame mit Zeichenfolgewerten. Da sie numerisch aussehen, können Sie diese Zeichenfolgen besser in Floats konvertieren:

df2 = df.astype(float)

Dies ändert jedoch die Ergebnisse, da Zeichenfolgen Zeichen für Zeichen vergleichen, während Fließkommas numerisch verglichen werden.

In [61]: '10' <= '4.2'
Out[61]: True

In [62]: 10 <= 4.2
Out[62]: False
55
unutbu

Sie können .equals für Spalten oder ganze Datenrahmen verwenden.

df['col1'].equals(df['col2'])

Wenn sie gleich sind, gibt diese Anweisung True zurück, andernfalls False.

30
ccook5760

Sie könnten apply () verwenden und so etwas tun

df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)

oder wenn Sie es vorziehen, kein Lambda zu verwenden 

def que(x):
    if x['one'] >= x['two'] and x['one'] <= x['three']:
        return x['one']
    else:
        ''
df['que'] = df.apply(que, axis=1)
19
Bob Haffner

Eine Möglichkeit besteht darin, eine Boolesche Reihe zum Indizieren der Spalte df['one'] zu verwenden. Dadurch erhalten Sie eine neue Spalte, in der die True-Einträge denselben Wert wie in derselben Zeile wie df['one'] haben und die False-Werte NaN sind.

Die boolesche Serie wird nur durch Ihre if-Anweisung angegeben (obwohl & anstelle von and verwendet werden muss):

>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
>>> df
    one two three   que
0   10  1.2 4.2      10
1   15  70  0.03    NaN
2   8   5   0       NaN

Wenn Sie möchten, dass die NaN-Werte durch andere Werte ersetzt werden, können Sie die fillna-Methode für die neue Spalte que verwenden. Ich habe hier 0 anstelle der leeren Zeichenfolge verwendet:

>>> df['que'] = df['que'].fillna(0)
>>> df
    one two three   que
0   10  1.2   4.2    10
1   15   70  0.03     0
2    8    5     0     0
8
Alex Riley

Wickeln Sie jede einzelne Bedingung in Klammern ein und kombinieren Sie die Bedingungen mit dem &-Operator:

df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']

Sie können die nicht übereinstimmenden Zeilen füllen, indem Sie mit ~ (dem Operator "nicht") die Übereinstimmung invertieren:

df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''

Sie müssen & und ~ anstelle von and und not verwenden, da die &- und ~-Operatoren Element für Element arbeiten.

Das Endergebnis:

df
Out[8]: 
  one  two three que
0  10  1.2   4.2  10
1  15   70  0.03    
2   8    5     0  
4
Marius

Verwenden np.select Wenn Sie mehrere Bedingungen haben, die vom Datenrahmen geprüft werden sollen, und eine bestimmte Auswahl in einer anderen Spalte ausgeben möchten

conditions=[(condition1),(condition2)]
choices=["choice1","chocie2"]

df["new column"]=np.select=(condtion,choice,default=)

Hinweis: Es sollten keine Bedingungen und keine Auswahl übereinstimmen. Wiederholen Sie den ausgewählten Text, wenn Sie für zwei verschiedene Bedingungen die gleiche Auswahl haben

0
psn1997

Ich denke, der Intuition des OP am nächsten kommt eine Inline-if-Anweisung:

df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) 
0
Nic Scozzaro