python - Pandas ,根据某些列值和 NAN 组合行

标签 python pandas

所以我有一个看起来像这样的 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。我想保留任何两个索引都不匹配的行。

最佳答案

我认为没有一个命令可以满足您的目的,也没有许多不同的方法可以实现这一目标。但是,您可以在彼此之后使用 meltpivot:

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

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

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

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

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

关于python - Pandas ,根据某些列值和 NAN 组合行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48115481/

相关文章:

python - 检测字符串迭代器是否为空格

Python:在 pandas GroupBy 对象上有效地使用 apply

python - Pandas:使用日期列表和 DateTimeIndex 访问数据

python - Pandas :返回以特定数字开头的列值

python - 添加 UTC 时间轴以以时间格式绘制本地时间

python - Pandas: reshape 数据框以将多列压缩为单行值

python - 上下文管理器适合这项工作吗?

python - 用于在 Python 中查找特征的未排序特征值

python - 嵌套循环或 'in' ,哪个更快?

python - 我可以为 Python 单元测试添加内存限制吗?