Python - 如何扩展 Pandas 数据框的行以包含键列的所有值组合?

标签 python pandas

假设我有以下 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 的术语)是 g1g2 .

如何扩展数据框,以便它为 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/

相关文章:

Python 2.7 : Passing class methods to another function

python - 与 Pandas 总结几个月

python - Pandas:借助字典将变量子字符串从 A 列插入 B 列

python - 使用 pandas 将两个数据帧与一行数据框组合在一起,然后是另一行数据框

python / Pandas : if value is NaN or 0 then fill with the value from the next column within the same row

python - 处理GAN框架时如何修复 "You must feed a value for placeholder tensor"?

python - 每个行条目的数据分为 2 行 - 用 pandas 读入

python - 我的 DataFrame 有 NaN 值但不应该

python - 循环内的 try-except

pandas - 如何在 Pandas 中按不同 DF 的日期时间范围进行分组