我的数据框看起来像这样
№№№ randomNumCol n_k
0 5 1
1 6 0
2 7 1
3 8 0
4 9 1
5 10 1
6 11 1
7 12 1
...
我需要填写n_k
列,如下所示:如果randomNumCol
列中的1
为№№№
,则复制0
列中的值。如果是n_k
,则插入列n_k
中的上一个值。
但是2
列中的第一个值应该等于 №№№ randomNumCol n_k
0 5 1 2
1 6 0 2
2 7 1 7
3 8 0 7
4 9 1 9
5 10 1 10
6 11 1 11
7 12 1 12
...
(现在我不知道为什么会这样)。
看起来应该是这样的
dftest['n_k'] = np.where(dftest['randomNumCol'] == 1, dftest['№№№'], dftest['n_k'].shift(1))
我的代码没有给出正确的结果
n_k
我不太明白如何使用shift()。如何处理2
中的第一个单元格,该单元格应始终为BS[0]
?
请问任何建议?
答案 0 :(得分:2)
您可以复制randomNumCol
1 的nan
列中的值,将剩余值设置为ffill
,然后使用{{1}填写缺失的值:
import pandas as pd
df['n_k'] = df['№№№'].where(df.randomNumCol == 1, pd.np.nan)
df['n_k'].iat[0] = 2
df['n_k'] = df['n_k'].ffill().astype(df['№№№'].dtype)
df
# №№№ randomNumCol n_k
#0 5 1 2
#1 6 0 2
#2 7 1 7
#3 8 0 7
#4 9 1 9
#5 10 1 10
#6 11 1 11
#7 12 1 12
答案 1 :(得分:2)
您可以使用fillna()
代替shift()
。
import pandas as pd
df['n_k']=np.nan
df.loc[df['randomNumCol']==1,'n_k']=df['№№№']
df.ix[0,'n_k']=2
df['n_k'].fillna(method='ffill')