将一行中的值映射为pandas中的新列

时间:2017-09-05 12:37:43

标签: python pandas

我有一个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

我希望我的最终数据框为:

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

即sr.no' a' a下的值应该有' a'作为b and c

的新列

3 个答案:

答案 0 :(得分:3)

where创建新列,条件按isnull创建,然后使用ffill替换前导填充NaN

上次按dropna删除NaN行,drop列删除

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 :(得分: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

答案 2 :(得分:0)

使用nan和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