pandas,根据某些列值和 NAN 组合行

2024-04-20

所以我有一个 pandas 数据框,如下所示:

id_1    id_2    value1    value2
1       2       100       NAN
1       2       NAN       101
10      20      200       NAN    
10      20      NAN       202
10      2       345       345

我想要一个像这样的数据框:

id_1    id_2    value1    value2
1       2       100       101
10      20      200       202    
a       b       c         d

基本上,如果两个 ID 列匹配,那么肯定会有一个value-nan vs nan-value情况,我想通过替换来合并行nans.

pandas 有这方面的实用工具吗?它并没有完全堆积或融化。也许可以旋转,但我需要两个不定值。我想保留任何不具有两个 indeces 匹配的行。


我认为没有一个命令可以满足您的目的,并且有许多不同的方法可以实现此目的。但是,您可以使用melt and pivot彼此之后:

id_vars = ["id_1", "id_2"]
melted = df.melt(id_vars=id_vars).dropna()
pivoted = melted.pivot_table(index=id_vars, columns="variable", values="value")

print(pivoted)

    variable    value1  value2
id_1    id_2        
1       2       100.0   101.0
10      2       345.0   345.0
        20      200.0   202.0

但是,上述解决方案比以下两个解决方案慢。

首先,您可以使用前向填充ffill填充 NaN 和last获取包含所有有效值的最后一行ffill:

ids = ["id_1", "id_2"]

df.groupby(ids).ffill()\
  .groupby(ids).last()\
  .reset_index()

    id_1    id_2    value1  value2
0   1       2       100     101
1   10      2       345     345
2   10      20      200     202

其次,不要分组两次(因为ffill返回一个数据框),您可以使用自定义apply其结果相同:

def collapse(x):
    return x.ffill().iloc[-1, 2:]

df.groupby(ids).apply(collapse).reset_index()

即使我们在这里使用 apply,它也是最快的解决方案(至少对于您提供的虚拟数据而言 - 对于较大的数据集,它可能会以不同的方式扩展)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pandas,根据某些列值和 NAN 组合行 的相关文章

随机推荐