Pandas 如果满足条件则复制行,并赋值
Pandas duplicating row if condition met, and assigning value
我有一个如下所示的 Pandas 数据框,其中 A 列 是一系列字符串值,B 列 维护 运行 列 A 中的值与前一个 列 A 中的值不同的总次数行。
A B
1 1
1 1
1b 2
1b 2
1b 2
1 3
每次 A 列的值发生变化时,我想复制前一行并为其分配 B 列的增量值。例如,对于上面的输入数据框,输出看起来喜欢:
A B
1 1
1 1
1 2
1b 2
1b 2
1b 2
1b 3
1 3
关于如何有效地解决这个问题有什么想法吗?
通过 B
筛选最后重复的值,然后仅移动 B
并分配回去,删除最后一行并通过 concat
最后连接在一起并按索引排序:
df1 = (df[df['B'].ne(df['B'].shift(-1))]
.assign(B = lambda x: x.B.shift(-1)).iloc[:-1].astype({'B':int}))
df = pd.concat([df, df1]).sort_index(ignore_index=True)
print (df)
A B
0 1 1
1 1 1
2 1 2
3 1b 2
4 1b 2
5 1b 2
6 1b 3
7 1 3
我有一个如下所示的 Pandas 数据框,其中 A 列 是一系列字符串值,B 列 维护 运行 列 A 中的值与前一个 列 A 中的值不同的总次数行。
A B
1 1
1 1
1b 2
1b 2
1b 2
1 3
每次 A 列的值发生变化时,我想复制前一行并为其分配 B 列的增量值。例如,对于上面的输入数据框,输出看起来喜欢:
A B
1 1
1 1
1 2
1b 2
1b 2
1b 2
1b 3
1 3
关于如何有效地解决这个问题有什么想法吗?
通过 B
筛选最后重复的值,然后仅移动 B
并分配回去,删除最后一行并通过 concat
最后连接在一起并按索引排序:
df1 = (df[df['B'].ne(df['B'].shift(-1))]
.assign(B = lambda x: x.B.shift(-1)).iloc[:-1].astype({'B':int}))
df = pd.concat([df, df1]).sort_index(ignore_index=True)
print (df)
A B
0 1 1
1 1 1
2 1 2
3 1b 2
4 1b 2
5 1b 2
6 1b 3
7 1 3