我正在使用Python和Pandas DataFrames。
我的数据框看起来像这样:
Index A B Copy_of_B
1 a 0 0
2 a 1 1
3 a 5 5
4 b 0 0
5 b 4 4
6 c 6 6
我的预期输出是:
Index A B Copy_of_B
1 a 0 1
2 a 1 1
3 a 5 5
4 b 0 4
5 b 4 4
6 c 6 6
我想用下一行中的值替换Copy_of_B
列中的0值,但是我不想使用for循环进行迭代。
有一个简单的解决方案吗?
谢谢
Barna
答案 0 :(得分:0)
您可以使用mask
和bfill
:
df['Copy_of_B'] = df['B'].mask(df['B'].eq(0)).bfill()
输出:
Index A B Copy_of_B
0 1 a 0 1.0
1 2 a 1 1.0
2 3 a 5 5.0
3 4 b 0 4.0
4 5 b 4 4.0
5 6 c 6 6.0
答案 1 :(得分:0)
我利用您的DataFrame具有由连续数字组成的索引这一事实。
从创建2个索引开始:
ind = df[df.Copy_of_B == 0].index
ind2 = ind + 1
第一个包含行的索引值,其中 Copy_of_B == 0 。 第二个包含后续行的索引。
然后,要将数据从后续行“复制”到包含零的行,请运行:
df.loc[ind, 'Copy_of_B'] = df.loc[ind2, 'Copy_of_B'].tolist()
如您所见,没有在整个DataFrame上运行的任何循环。