Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫,根据特定列值和NAN组合行_Python_Pandas - Fatal编程技术网

Python 熊猫,根据特定列值和NAN组合行

Python 熊猫,根据特定列值和NAN组合行,python,pandas,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 id_1 id_2 value1 value2 1 2

我有一个熊猫数据框,看起来像这样:

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_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
来组合行

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

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


我不认为有一个单一的命令为您的目的和许多不同的方式来实现这一点。但是,您可以在彼此之后使用
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
但是,上面的解决方案比下面的两个解决方案慢

首先,您可以使用forward fill
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()

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

groupby
+
首先

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

您还可以将其相加为
np。默认情况下,nan
将被忽略

df = df.replace("NAN", np.nan). # turn "NAN" to np.nan
df.groupby(["id_1", "id_2"])["value1", "value2"].sum().reset_index()