2016-02-21 12 views
5

otrzymuje następujące dataframe:Pandy Wykorzystanie wartości, jeśli nie jest pusta, inaczej Korzystanie wartość z następnej kolumny

import pandas as pd 
df = pd.DataFrame({'COL1': ['A', np.nan,'A'], 
        'COL2' : [np.nan,'A','A']}) 
df 
    COL1 COL2 
0 A  NaN 
1 NaN A 
2 A  A 

Chciałbym utworzyć kolumnę („Col3”), który używa wartości z Col1 na wiersz, chyba że wartość to null (lub NaN). Jeśli wartość jest zerowa (lub NaN), chciałbym, aby używał wartości z COL2.

Pożądany wynik jest:

COL1 COL2 COL3 
0 A  NaN A 
1 NaN A  A 
2 A  A  A 

Z góry dzięki!

Odpowiedz

12
In [8]: df 
Out[8]: 
    COL1 COL2 
0 A NaN 
1 NaN B 
2 A B 

In [9]: df["COL3"] = df["COL1"].fillna(df["COL2"]) 

In [10]: df 
Out[10]: 
    COL1 COL2 COL3 
0 A NaN A 
1 NaN B B 
2 A B A 
3

Jeśli mod swoją df nieznacznie wtedy widać, że to działa i faktycznie działa dla dowolnej liczby kolumn tak długo, jak długo istnieje jeden ważny wartość:

In [5]: 
df = pd.DataFrame({'COL1': ['B', np.nan,'B'], 
        'COL2' : [np.nan,'A','A']}) 
df 

Out[5]: 
    COL1 COL2 
0 B NaN 
1 NaN A 
2 B A 

In [6]:  
df.apply(lambda x: x[x.first_valid_index()], axis=1) 

Out[6]: 
0 B 
1 A 
2 B 
dtype: object 

first_valid_index zwróci wartość indeksu (w tym przypadku kolumny), który zawiera pierwszą wartość NaN-non:

In [7]: 
df.apply(lambda x: x.first_valid_index(), axis=1) 

Out[7]: 
0 COL1 
1 COL2 
2 COL1 
dtype: object 

Więc możemy użyć tego do indeksu do serii

1

Możesz użyć np.where, aby warunkowo ustawić wartości kolumn.

df = df.assign(COL3=np.where(df.COL1.isnull(), df.COL2, df.COL1)) 

>>> df 
    COL1 COL2 COL3 
0 A NaN A 
1 NaN A A 
2 A A A 

Jeśli nie masz nic przeciwko mutowaniu wartości w COL2, możesz zaktualizować je bezpośrednio, aby uzyskać pożądany wynik.

df = pd.DataFrame({'COL1': ['A', np.nan,'A'], 
        'COL2' : [np.nan,'B','B']}) 

>>> df 
    COL1 COL2 
0 A NaN 
1 NaN B 
2 A B 

df.COL2.update(df.COL1) 

>>> df 
    COL1 COL2 
0 A A 
1 NaN B 
2 A A 
Powiązane problemy