基于行值将一行插入到pandas数据帧中?

5

I have a DataFrame:

df = pd.DataFrame({'B':[2,1,2],'C':['a','b','a']})
  B C
0 2 'a'
1 1 'b'
2 2 'a'

我想在任何出现'b'的行上面插入一行,这一行与原先的行相同,只是把'b'变成了'c',最终得到以下结果:
  B C
0 2 'a'
1 1 'b'
1 1 'c'
2 2 'a'

我真的想不出怎么做这件事情。


2
你之前说的是上面,但输出结果却在下面;你的第一个数据框在第三行产生了 a 而不是 c - shivsn
2
如果有两个连续的行都有 b,会怎么样? - Divakar
@shivsn 抱歉,打错字了。 - BobbyJohnsonOG
@Divakar,这不太可能发生,但如果确实发生了,那么我只需要在每个“b”行上面插入一个“c”行。 - BobbyJohnsonOG
你对循环满意吗? - IanS
@IanS,说实话我对任何东西都很满意。不过MadScone似乎已经做得很好了。 - BobbyJohnsonOG
2个回答

5
这里提供一种做法:
duplicates = df[df['C'] == 'b'].copy()
duplicates['C'] = 'c'
df.append(duplicates).sort_index()

太好了,没想到还有一个复制功能! - BobbyJohnsonOG

1

在NumPy级别工作,这是一种矢量化的方法 -

arr = df.values
idx = np.flatnonzero(df.C=='b')
newvals = arr[idx]
newvals[:,df.columns.get_loc("C")] = 'c'
out = np.insert(arr,idx+1,newvals,axis=0)
df_index = np.insert(np.arange(arr.shape[0]),idx+1,idx,axis=0)
df_out = pd.DataFrame(out,index=df_index)

示例运行 -

In [149]: df
Out[149]: 
   B  C
0  2  a
1  1  b
2  2  d
3  4  d
4  3  b
5  8  a
6  4  a
7  2  b

In [150]: df_out
Out[150]: 
   0  1
0  2  a
1  1  b
1  1  c
2  2  d
3  4  d
4  3  b
4  3  c
5  8  a
6  4  a
7  2  b
7  2  c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接