按行数元素从数据框中删除列

时间:2017-09-08 17:44:42

标签: python pandas

假设我构造了以下数据帧:

a = pd.DataFrame({'a':np.arange(5)})
b = pd.DataFrame({'b':np.arange(4)})
c = pd.DataFrame({'c':np.arange(5)})
d = pd.DataFrame({'d':np.arange(7)})
df = pd.concat([a,b,c,d,],ignore_index=False, axis=1)

这会产生以下数据帧:

df
Out[86]: 
     a    b    c  d
0  0.0  0.0  0.0  0
1  1.0  1.0  1.0  1
2  2.0  2.0  2.0  2
3  3.0  3.0  3.0  3
4  4.0  NaN  4.0  4
5  NaN  NaN  NaN  5
6  NaN  NaN  NaN  6

如何在不使用dropna的情况下删除长度恰好为5个数字元素的所有列?

输出将是:

df
Out[88]: 
     a      c  
0  0.0    0.0  
1  1.0    1.0  
2  2.0    2.0  
3  3.0    3.0  
4  4.0    4.0  

2 个答案:

答案 0 :(得分:2)

这将检查数据框中的每个值是浮点数还是整数,并按列对结果求和。然后它会过滤总数等于五的位置。

>>> df[df.columns[(df.apply(
        lambda series: [isinstance(val, (float, int)) and not np.isnan(val) 
                        for val in series]).sum() == 5)]]
    a   c
0   0   0
1   1   1
2   2   2
3   3   3
4   4   4
5 NaN NaN
6 NaN NaN

答案 1 :(得分:1)

您可以使用以下内容:

filt = df.count() != 5
df = df.drop(df.columns[filt], axis=1)

这会给你:

     a    c
0  0.0  0.0
1  1.0  1.0
2  2.0  2.0
3  3.0  3.0
4  4.0  4.0
5  NaN  NaN
6  NaN  NaN

然后至于删除第5行和第6行,这实际上是dropna的设计(就像你的整个问题一样),但如果你坚持......

filt2 = df.T.isnull().any()
df = df.drop(df.index[filt2])

这假定您的数据是数字。如果它包含对象dtypes(字符串),则您需要运行类型检查,例如在@Alexander's answer中。