熊猫:插入没有循环的行

时间:2017-05-20 16:57:56

标签: python pandas insert

我已经看到了“在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

感谢任何帮助。

1 个答案:

答案 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)

现在我们可以连接dfnew,在结果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