所以我有一个看起来像这样的 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
和 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
其次,您可以使用具有相同结果的自定义 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/