2017-09-05 2 views
0

ich Pandas Datenrahmen habe:Karte Wert von einer Zeile als neue Spalte in Pandas

SrNo value 
a  nan 
1  100 
2  200 
3  300 
b  nan 
1  500 
2  600 
3  700 
c  nan 
1  900 
2  1000 

ich will meinen letzten Datenrahmen als:

value new_col 
100  a 
200  a 
300  a 
500  b 
600  b 
700  b 
900  c 
1000  c 

dh für sr.no 'a' die unter a Werte sollten

Antwort

3

erstellen neue Spalte von where mit Bedingung ‚a‘ als eine neue Spalte in ähnlicher Weise b and c für haben dann von isnull, ffill verwenden fürersetzens durch Vorwärtsfüllung.

Last NaN s Reihen von dropna und Spalte von drop entfernen:

print (df['SrNo'].where(df['value'].isnull())) 
0  a 
1  NaN 
2  NaN 
3  NaN 
4  b 
5  NaN 
6  NaN 
7  NaN 
8  c 
9  NaN 
10 NaN 
Name: SrNo, dtype: object 

df['new_col'] = df['SrNo'].where(df['value'].isnull()).ffill() 
df = df.dropna().drop('SrNo', 1) 
print (df) 
    value new_col 
1 100.0  a 
2 200.0  a 
3 300.0  a 
5 500.0  b 
6 600.0  b 
7 700.0  b 
9 900.0  c 
10 1000.0  c 
1

Hier ist eine Art und Weise

In [2160]: df.assign(
       new_col=df.SrNo.str.extract('(\D+)', expand=True).ffill() 
      ).dropna().drop('SrNo', 1) 
Out[2160]: 
    value new_col 
1 100.0  a 
2 200.0  a 
3 300.0  a 
5 500.0  b 
6 600.0  b 
7 700.0  b 
9 900.0  c 
10 1000.0  c 
0

Eine weitere Möglichkeit, mit ersetzen Zahlen mit nan und ffill()

df['col'] = df['SrNo'].replace('([0-9]+)',np.nan,regex=True).ffill() 
df = df.dropna(subset=['value']).drop('SrNo',1) 

Ausgabe:

 
     value col 
1 100.0 a 
2 200.0 a 
3 300.0 a 
5 500.0 b 
6 600.0 b 
7 700.0 b 
9 900.0 c 
10 1000.0 c 
Verwandte Themen