這些都不是一個僅pandas
解決方案。我提供了他們,因爲我發現探索替代品有趣。 bincount
基礎解決方案速度非常快,但透明度較差。
創造性的解決方案1
collections.defaultdict
和字典解析
from collections import defaultdict
d = defaultdict(dict)
[d[c2].setdefault(c1, c3) for i, c1, c2, c3 in df.itertuples()];
pd.DataFrame(d)
lmn pqr xyz
A NaN 2 1.0
B 1.0 3 2.0
C NaN 2 NaN
創造性的解決方案2
pd.factorize
和np.bincount
f1, u1 = pd.factorize(df.Col1.values)
f2, u2 = pd.factorize(df.Col2.values)
w = df.Col3.values
n, m = u1.size, u2.size
v = np.bincount(f1 * n + f2, w, n * m).reshape(n, m)
pd.DataFrame(np.ma.array(v, mask=v == 0), u1, u2)
lmn pqr xyz
A NaN 2 1.0
B 1.0 3 2.0
C NaN 2 NaN
時序
%timeit df.pivot(index='Col1',columns='Col2',values='Col3')
%timeit df.set_index(['Col1','Col2'])['Col3'].unstack()
%timeit df.groupby(['Col1','Col2'])['Col3'].mean().unstack()
%timeit df.pivot_table(index='Col1',columns='Col2',values='Col3')
%%timeit
d = defaultdict(dict)
[d[c2].setdefault(c1, c3) for i, c1, c2, c3 in df.itertuples()];
pd.DataFrame(d)
%%timeit
f1, u1 = pd.factorize(df.Col1.values)
f2, u2 = pd.factorize(df.Col2.values)
w = df.Col3.values
n, m = u1.size, u2.size
v = np.bincount(f1 * n + f2, w, n * m).reshape(n, m)
pd.DataFrame(np.ma.array(v, mask=v == 0), u1, u2)
小數據
1000 loops, best of 3: 1.11 ms per loop
1000 loops, best of 3: 1.67 ms per loop
1000 loops, best of 3: 1.51 ms per loop
100 loops, best of 3: 4.17 ms per loop
1000 loops, best of 3: 1.18 ms per loop
1000 loops, best of 3: 420 µs per loop
介質數據
from string import ascii_letters
l = list(ascii_letters)
df = pd.DataFrame(dict(
Col1=np.random.choice(l, 10000),
Col2=np.random.choice(l, 10000),
Col3=np.random.randint(10, size=10000)
)).drop_duplicates(['Col1', 'Col2'])
1000 loops, best of 3: 1.75 ms per loop
100 loops, best of 3: 2.17 ms per loop
100 loops, best of 3: 2.2 ms per loop
100 loops, best of 3: 4.89 ms per loop
100 loops, best of 3: 5.6 ms per loop
1000 loops, best of 3: 549 µs per loop
必須重複,因爲錯誤。最後一個。我添加了檢查它的代碼。 – jezrael
謝謝!我得到了ValueError。但是,我不能使用您提到的平均方法,因爲這些值是分類變量。有什麼辦法可以使用它遇到的第一行(例如忽略行A,xyz,5)? – Melsauce
查看編輯答案。 – jezrael