>我有一个这样的数据帧:
rawdata = {'col1': [3 ,nan ,4 ,7 ,nan ,5],
'col2': [10 ,20 ,10 ,30 ,10 ,40],
'col3': [23 ,34 ,45 ,56 ,34 ,23],
'col4': [5 ,4 ,nan ,5 ,1 ,nan],
'col5': [28 ,33 ,33 ,4 ,nan ,44]}
我想要的是:
- 删除所有
nan
- 包括除col4
之外的列 - 获取
col4
所在的位置的数据nan
最终,我需要以下内容:
target = {'col2': [10 ,40],
'col3': [45 ,23],
'col4': [nan ,nan]}
这是代码:
rawdata.drop(["col1", "col5"], axis = 1, inplace= True)
rawdata = rawdata[rawdata.isnull().any(axis=1)][rawdata .columns[rawdata .isnull().any()]]
但是,这只返回了我 col4 本身。我也需要col2和col3。
假设您可以对包含 nan 的列进行硬编码(正如您自己的示例所表明的那样),这归结为df.drop(['col1', 'col5'], axis=1)[df.col4.isna()]
。使用您的测试数据:
In [13]: df
Out[13]:
col1 col2 col3 col4 col5
0 3.0 10 23 5.0 28.0
1 NaN 20 34 4.0 33.0
2 4.0 10 45 NaN 33.0
3 7.0 30 56 5.0 4.0
4 NaN 10 34 1.0 NaN
5 5.0 40 23 NaN 44.0
In [14]: df.drop(['col1', 'col5'], axis=1)[df.col4.isna()]
Out[14]:
col2 col3 col4
2 10 45 NaN
5 40 23 NaN
如果您不想对这些列进行硬编码,则采用不同的方法是
In [35]: df.drop(df.columns[df.isna().any()].difference({'col4'}), axis=1)[df.col4.isna()]
Out[35]:
col2 col3 col4
2 10 45 NaN
5 40 23 NaN
我在这里假设你已经用df = pd.DataFrame(rawdata)
构建了一个数据帧
我将首先构建一个包含要保留的列的系列:
keep = df.count() == len(df)
deep['col4'] = True
那么你想要的很简单:
df.loc[df.col4.isna(), keep]
它按预期给出:
col2 col3 col4
2 10 45 NaN
5 40 23 NaN
如果你想要一个字典,它只是df.loc[df.col4.isna(), keep].to_dict()