需要在这里解释pandas.drop的工作方式

时间:2019-06-04 19:14:31

标签: pandas

我有一个数据框,比方说xyz。我编写了代码,以找出数据框中每一列所具有的空值的百分比。我的代码如下:

round(100*(xyz.isnull().sum()/len(xyz.index)), 2)

说我得到了以下结果:

abc               26.63
def               36.58
ghi               78.46

我想删除ghi列,因为它的空值超过70%。

我使用以下代码实现了它:

xyz = xyz.drop(xyz.loc[:,round(100*(xyz.isnull().sum()/len(xyz.index)), 2)>70].columns, 1)

但是,我不明白这段代码是如何工作的,任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:3)

代码正在执行以下操作:

d = dict(zip(*mylist)) # if [[1, 2, 3], ['2000', '2000a', '2000b']]
d = dict(mylist)       # if [[1, '2000'], [2, '2000a'], [3,'2000b']]

df['npi'] = df.RPN.map(d).fillna(df.RPN)

#   RPN   Source       city    npi
#0    1  netflix  baltimore   2000
#1    1  netflix  baltimore   2000
#2    2     hulu    orlando  2000a
#3    4     hulu    houston      4

按行或按列删除给定轴的指定元素。在这种情况下,xyz.drop( [...], 1) 表示您要按第1轴放行,即列

df.drop( ..., 1)

将返回一个列表,其中包含您的切片条件产生的列名

xyz.loc[:, ... ].columns

该指令计算空值的数量,将它们相加并通过行数进行归一化,从而有效计算每一列中round(100*(xyz.isnull().sum()/len(xyz.index)), 2)>70 的百分比。然后,将金额四舍五入为只有2个小数位,最后您返回True,即nan的数量大于70%。因此,您将获得列与True / False数组之间的映射。

将所有内容放在一起:首先要生成一个布尔数组,该数组标记哪些列的百分比超过nan,然后使用。nan,您可以使用布尔索引来仅查看您所查看的列要删除(nan%> 70%),然后使用loc恢复此类列的名称,然后这些列将由.columns指令使用。

希望这可以解决所有问题!

答案 1 :(得分:2)

如果您的代码难以理解,则只需用dropna来检查thresh,因为pandas已经涵盖了这种情况。

df=df.dropna(axis=1,thresh=round(len(df)*0.3))