这是一个最小的例子:
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)
有更快的方法吗?
答案 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