通过放下缺失的元素来凝结熊猫数据框



问题

我有一个看起来像这样的数据框架:

Key Var    ID_1 Var_1   ID_2 Var_2  ID_3 Var_3
1   True   1.0  True    NaN  NaN    5.0  True
2   True   NaN  NaN     4.0  False  7.0  True
3   False  2.0  False   5.0  True   NaN  NaN

每行完全具有2个非磁性数据集(ID/VAR),其余的第三行保证为null。我想做的是通过删除缺失的元素来"凝结"数据框。

所需的输出

Key Var     First_ID    First_Var   Second_ID   Second_Var
1   True    1           True        5           True
2   True    4           False       7           True
3   False   2           False       5           True

只要维持ID/var对,订购就不重要。


当前解决方案

以下是我拥有的工作解决方案:

import pandas as pd
import numpy as np
data = pd.DataFrame({'Key': [1, 2, 3], 'Var': [True, True, False], 'ID_1':[1, np.NaN, 2],
                    'Var_1': [True, np.NaN, False], 'ID_2': [np.NaN, 4, 5], 'Var_2': [np.NaN, False, True],
                    'ID_3': [5, 7, np.NaN], 'Var_3': [True, True, np.NaN]})
sorted_columns = ['Key', 'Var', 'ID_1', 'Var_1', 'ID_2', 'Var_2', 'ID_3', 'Var_3']
data = data[sorted_columns]
output = np.empty(shape=[data.shape[0], 6], dtype=str)
for i, *row in data.itertuples():
    output[i] = [element for element in row if np.isfinite(element)]
print(output)

[['1' 'T' '1' 'T' '5' 'T']
 ['2' 'T' '4' 'F' '7' 'T']
 ['3' 'F' '2' 'F' '5' 'T']]

这是可以接受的,但不是理想的。我可以忍受没有列名称,但是我的最大问题是必须将数据投放到字符串中,以避免将我的布尔人转换为数字。

还有其他解决方案可以更好地保存数据吗?如果结果是PANDAS DATAFRAME。

有一个简单的解决方案,即将NAN推到右侧,然后将NAN放在轴1上。即

ndf = data.apply(lambda x : sorted(x,key=pd.isnull),1).dropna(1)

输出:

  密钥var id_1 var_1 id_2 var_20 1 true 1 true 5 true1 2 true 4 false 7 true2 3错误2 false 5 true

希望它有帮助。

在此处使用Divakar的Numpy解决方案,以10倍速度,即

def mask_app(a):
    out = np.full(a.shape,np.nan,dtype=a.dtype)
    mask = ~np.isnan(a.astype(float))
    out[np.sort(mask,1)[:,::-1]] = a[mask]
    return out
ndf = pd.DataFrame(mask_app(data.values),columns=data.columns).dropna(1)
  密钥var id_1 var_1 id_2 var_20 1 true 1 true 5 true1 2 true 4 false 7 true2 3错误2 false 5 true

最新更新