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

2024-10-01 09:24:32 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个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

我想要这样的数据帧:

^{pr2}$

基本上,如果两个ID列匹配,那么肯定会出现value-nanvsnan-value的情况,我想通过替换nans来组合这些行。在

熊猫有这个用途吗?它不是堆积的,也不是融化的。可能是旋转,但我需要两个索引。我想保留任何两个索引都不匹配的行。在


Tags: 数据idpandasvalue情况nan用途value1
3条回答

groupby+first

df=df.replace('NAN',np.nan) # make sure it is np.nan not string NAN

df.groupby(['id_1','id_2'],as_index=False).first()
Out[37]: 
   id_1  id_2 value1 value2
0     1     2    100    101
1    10     2    345    345
2    10    20    200    202

我不认为有一个单一的命令和许多不同的方法来实现这一点。但是,您可以在后面使用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

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

首先,可以使用forward fill ffill填充nan,使用last获得最后一行,该行包含由于ffill而产生的所有有效值:

^{pr2}$

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

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

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

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

单向(df是初始数据帧):

df1=df.dropna(subset=["value1"]).drop("value2",axis=1)
df2=df.dropna(subset=["value2"]).drop("value1",axis=1)
dfNew=pd.concat([df1,df2],axis=1)

相关问题 更多 >