2017-09-05 62 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