添加具有相同索引的一个DataFrame的行

时间:2018-02-21 11:15:01

标签: python-3.x performance pandas dataframe

这是一个最小的例子:

import pandas as pd
df = pd.DataFrame({'x': [0, 0, np.NaN, 1], 'y': [1, 0, 0, np.NaN], 'z': [np.NaN, 1, 1, 0]}, dtype = int, index = ['a', 'a', 'b', 'b'])

       x      y      z
a      0      1    NaN
a      0      0      1
b    NaN      0      1
b      1    NaN      0

值只能是0,1或NaN。我想添加具有相同索引的行,忽略NaN值。结果将在这里:

       x      y      z
a      0      1      1 
b      1      0      1

我这样做的方式:

df.max(level = 0)

有更快的方法吗?

1 个答案:

答案 0 :(得分:2)

同样,性能应该相似 - 主要取决于数据:

df.groupby(level = 0).max()

时间比较:

In [15]: %timeit df.groupby(level = 0).max()
    ...: 
100 loops, best of 3: 8.08 ms per loop
In [12]: %timeit df.max(level = 0)
    ...: 
100 loops, best of 3: 8.04 ms per loop

一些更大的数据:

N = 100000
idx = np.random.randint(10000, size=N).astype(str)
df = pd.DataFrame(np.random.choice([0,1,np.nan], size=(N,3)), index=idx)
df = df.sort_index()
print (df.head())

In [174]: %timeit df.max(level = 0)
100 loops, best of 3: 19.5 ms per loop

In [175]: %timeit df.groupby(level = 0).max()
10 loops, best of 3: 24 ms per loop