假设我有许多具有不同列名的行,如何更有效地将它们添加到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]))
column_name = ['a','b','c','m']
d = pd.DataFrame(columns = column_name)
d.add(a)
d.add(b)
由于第一种方式需要join
,所以应该比方式2更快?
还是有更好的解决方案?
答案 0 :(得分:2)
您也可以尝试使用pd.concat
和combine_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
更快