2017-09-05 74 views
0

我有一個熊貓數據幀新的列:地圖值作爲熊貓

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

我希望我的最終數據幀爲:

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

即對sr.no「A」的下值應該有「一」作爲一個新的類似的b and c

回答

3

列由isnull與條件由where創建新列,然後使用ffill方法爲更換NaN由前向填充。

最後由drop通過dropna和列刪除NaN s行:

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

這裏有一種方法

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

與楠和ffill()代替號的另一個方法

df['col'] = df['SrNo'].replace('([0-9]+)',np.nan,regex=True).ffill() 
df = df.dropna(subset=['value']).drop('SrNo',1) 
輸入:
 
     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