Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.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 通过删除缺少的元素来压缩数据帧_Python_Pandas_Numpy - Fatal编程技术网

Python 通过删除缺少的元素来压缩数据帧

Python 通过删除缺少的元素来压缩数据帧,python,pandas,numpy,Python,Pandas,Numpy,问题 我有一个如下所示的数据帧: 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),剩余的第三个数据集保证为空。我想做的是通过删除缺少的元

问题

我有一个如下所示的数据帧:

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),剩余的第三个数据集保证为空。我想做的是通过删除缺少的元素来“压缩”数据帧

所需输出

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']]
这是可以接受的,但并不理想。我可以忍受没有列名,但我的大问题是必须将数组中的数据转换为字符串,以避免布尔值转换为数字


是否有其他解决方案能够更好地保存数据?如果结果是熊猫数据帧,则可获得额外积分。

有一个简单的解决方案,即向右推动NAN,然后将NAN放置在轴1上。i、 e

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

Key Var ID_1 Var_1 ID_2 Var_2 0 1 True 1 True 5 True 1 2 True 4 False 7 True 2 3 False 2 False 5 True 键变量ID_1变量ID_2变量2 0 1真1真5真 1 2正确4错误7正确 2 3假2假5真
这很聪明+1这很管用——虽然没有numpy解决方案快,但它确实保留了数据的原始格式。如果您在问题中添加numpy标记,这样numpy专家可能会给出更快的答案,那就太好了。@ZachTurn好了,这就是一个保留数据的numpy解决方案。
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)
Key Var ID_1 Var_1 ID_2 Var_2 0 1 True 1 True 5 True 1 2 True 4 False 7 True 2 3 False 2 False 5 True