假设我有以下 df:
df=pd.DataFrame({'g1':['a','b','c'],
'g2':['x','y','z'],
'val':[1,2,3]})
df
g1 g2 val
a x 1
b y 2
c z 3
其“主键”(此处使用 SQL 的术语)是
g1
和 g2
.如何扩展数据框,以便它为
g1
中现有值的每个组合都有一行和 g2
.对于添加的行,将 np.nan 留在 val 列下就可以了。所以结果将如下所示:g1 g2 val
a x 1.0
a y NaN
a z NaN
b x NaN
b y 2.0
b z NaN
c x NaN
c y NaN
c z 3.0
我目前正在执行以下操作,但我确定这不是最佳解决方案:
df.set_index(['g1','g2']).T.stack().unstack().T.reset_index()
我也可以进行合并,但是当键的数量很大时,代码看起来很麻烦。
最佳答案
使用@senderle 的 fast cartesian_product
性能:
v = cartesian_product(df.g1, df.g2)
idx = pd.MultiIndex.from_arrays([v[:, 0], v[:, 1]])
df.set_index(['g1', 'g2']).reindex(idx)
val
a x 1.0
y NaN
z NaN
b x NaN
y 2.0
z NaN
c x NaN
y NaN
z 3.0
%timeit df.set_index(['g1','g2']).T.stack().unstack().T
%%timeit
v = cartesian_product(df.g1, df.g2)
idx = pd.MultiIndex.from_arrays([v[:, 0], v[:, 1]])
df.set_index(['g1', 'g2']).reindex(idx)
14.6 ms ± 840 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
4.56 ms ± 284 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
关于Python - 如何扩展 Pandas 数据框的行以包含键列的所有值组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52104737/