如何有效地向具有缺失值的pandas DataFrame添加行?

时间:2015-12-24 09:50:07

标签: python performance pandas

假设我有许多具有不同列名的行,如何更有效地将它们添加到pandas的DataFrame中。

d = pd.DataFrame()
a = {'a':10,'b':1.3}
b = {'b':32.5,'c':3.14, 'm': 5.1}

我想要这样的结果:

d = 
     a   b  c  m
 1  10 1.3  0  0 
 2  0  32.5 3.14 5.1

有两种方法:

1

d = d.append(pd.DataFrame(a,index=[1]))
d = d.append(pd.DataFrame(b,index=[2]))
  1. 首先获取所有唯一列名,然后
  2. column_name = ['a','b','c','m']
    d = pd.DataFrame(columns = column_name)
    d.add(a)
    d.add(b)
    

    由于第一种方式需要join,所以应该比方式2更快?

    还是有更好的解决方案?

1 个答案:

答案 0 :(得分:2)

您也可以尝试使用pd.concatcombine_first。你的第二种方法没有正常工作(或者我可能错过了一些东西)。结果:

df1 = pd.DataFrame(a, index=[0])
df2 = pd.DataFrame(b, index=[1])

d = pd.DataFrame()
d = d.append(df1)
d = d.append(df2).fillna(0)

In [107]: d
Out[107]: 
    a     b     c    m
0  10   1.3  0.00  0.0
1   0  32.5  3.14  5.1


column_name = ['a', 'b', 'c', 'm']
d = pd.DataFrame(columns = column_name)
d.add(a)
d.add(b)

In [113]: d
Out[113]: 
Empty DataFrame
Columns: [a, b, c, m]
Index: []


In [115]: pd.concat([df1, df2]).fillna(0)
Out[115]: 
    a     b     c    m
0  10   1.3  0.00  0.0
1   0  32.5  3.14  5.1

d = pd.DataFrame()
In [144]: d.combine_first(df1).combine_first(df2).fillna(0)
Out[144]: 
    a     b     c    m
0  10   1.3  0.00  0.0
1   0  32.5  3.14  5.1

基准:

In [86]: %%timeit
d = pd.DataFrame()
d = d.append(df1)
d = d.append(df2).fillna(0)
   ....: 
100 loops, best of 3: 3.29 ms per loop

In [87]: %timeit c = pd.concat([df1, df2]).fillna(0)
100 loops, best of 3: 1.94 ms per loop

In [153]: %%timeit
   .....: d = pd.DataFrame()
   .....: d.combine_first(df1).combine_first(df2).fillna(0)
   .....: 
100 loops, best of 3: 3.17 ms per loop

从这些方法pd.concat更快