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