我有以下数据,我尝试执行以下操作;
数据:
data = {'tag_0': ['1', '2', '3'],
'tag_1': ['4', '5', '6'],
'tag_2': ['7', '8', '9'],
'tag_3': ['NaN', '10', '11'],
'tag_4': ['NaN', 'NaN', '12']}
df_1 = pd.DataFrame(data, columns = ['tag_0', 'tag_1', 'tag_2', 'tag_3', 'tag_4'])
答案 0 :(得分:1)
我喜欢在熊猫中使用bool口罩来完成此类任务,因为我认为它很容易阅读,但是还有其他解决方法。
什么是防毒面具?
布尔型掩码实际上是Series
的True / False值,该值应用于DataFrame
进行过滤。
步骤1:创建True / False值的Series
。
tag_3_is_nan = df['tag3'].isna()
tag_4_is_nan = df['tag4'].isna()
步骤2:将它们应用于DataFrame
df[bool_mask]
在您的情况下,将使用以下逻辑进行应用。
情况1:如果tag_3和tag_4中的元素为“ NaN”,则返回包含以下列的中间df:tag_0,tag_1和tag_2。
df[tag_3_is_nan & tag_4_is_nan][['tag_0', 'tag_1', 'tag_2']]
情况2:如果tag_4中的元素仅是'NaN',则返回具有以下列的另一个中间df:tag_0,tag_2,tag_3。
df[tag_4_is_nan & ~tag_3_is_nan][['tag_0', 'tag_2', 'tag_3']]
~
等于not
-因此~tag_3_is_nan
表示tag_3不是nan。
情况3:最后,如果所有列都具有非NaN值,则返回包含以下列的中间df:tag_0,tag_3,tag_4。
在熊猫中,删除包含至少一个NaN值的所有行很简单-只需使用方法dropna()
df.dropna()[['tag_0', 'tag_3', 'tag_4']]
settingWithCopyWarning
下移,您应该复制过滤后的df
。以上使用None
,但是您的示例使用'NaN'
作为string
。如果您的数据包含字符串'NaN'
而不是实际的None
,则可以使用相同的方法。
tag_3_is_nan_string = df['tag3'] == 'NaN'