我已经看到了“在pandas数据帧中插入一行”的一些答案,但它们通常假定单行插入,或者与我正在寻找的内容略有不同。
我希望根据条件多次从另一个数据帧插入df
行。
以下代码“有效”,因为它为我提供了我正在寻找的内容,但我想知道是否可以在没有for
循环的情况下完成此操作。
df = pd.DataFrame({
'a':[1,2,3,2,3,1,1,2,1,2,3,3,1,3],
'b':[0,0,0,0,0,0,0,0,0,0,0,0,0,0]
})
df2 = pd.DataFrame(columns = df.columns)
row_fill = pd.DataFrame({'a':[100],'b':[200]})
for i in df.index:
if df['a'][i] == 2:
df2 = df2.append(row_fill)
df2 = df2.append(df.loc[i])
df2.reset_index(inplace = True, drop = True)
df = df2
感谢任何帮助。
答案 0 :(得分:1)
我这样做:
来源DF:
In [153]: df
Out[153]:
a b
0 1 0
1 2 0
2 3 0
3 2 0
4 3 0
5 1 0
6 1 0
7 2 0
8 1 0
9 2 0
10 3 0
11 3 0
12 1 0
13 3 0
<强>解决方案:强>
In [154]: idx = np.argwhere(df.a == 2) # Pandas alternative: idx = df.index[df.a == 2]
In [155]: new = pd.concat([row_fill] * len(idx)).set_index(idx-1)
In [156]: new
Out[156]:
a b
0 100 200
2 100 200
6 100 200
8 100 200
使用DataFrame构造函数可以实现相同的目的:
new = pd.DataFrame(row_fill.values.tolist() * len(idx),
columns=row_fill.columns, index=idx-1)
现在我们可以连接df
和new
,在结果DF中排序索引并重置索引:
In [157]: res = pd.concat([df, new]).sort_index().reset_index(drop=True)
In [158]: res
Out[158]:
a b
0 1 0
1 100 200
2 2 0
3 3 0
4 100 200
5 2 0
6 3 0
7 1 0
8 1 0
9 100 200
10 2 0
11 1 0
12 100 200
13 2 0
14 3 0
15 3 0
16 1 0
17 3 0