假设我构造了以下数据帧:
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
答案 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中。