我有以下代码:
def check(df, columns):
for col in columns:
if df[col].sum(axis=0) == 0:
return True
return false
此代码遍历df
的列,并检查列中所有值的总和是否等于0(即所有值均为0,而忽略空字段)。
如果columns
中的列之一为非数字,则失败。如何添加条件df[col].sum(axis=0) == 0
仅适用于数字列,并且应该忽略空行(如果有)?
答案 0 :(得分:1)
使用:
df = pd.DataFrame({
'A':list('abcdef'),
'B':[0,0,np.nan,0,-0,0],
'C':[7,8,9,4,2,3],
'E':[5,3,6,9,2,4],
'F':list('aaabbb')
})
print (df)
A B C E F
0 a 0.0 7 5 a
1 b 0.0 8 3 a
2 c NaN 9 6 a
3 d 0.0 4 9 b
4 e 0.0 2 2 b
5 f 0.0 3 4 b
def check(df, columns):
return df[columns].select_dtypes(np.number).fillna(0).eq(0).all().any()
print (check(df, df.columns))
True
另一种替代方法是测试缺失值并按|
按位OR
链接布尔布尔DataFrame:
def check(df, columns):
df1 = df[columns].select_dtypes(np.number)
return (df1.eq(0) | df1.isna()).all().any()
说明:
首先选择列表中指定的列,对所有列进行采样,然后按DataFrame.select_dtypes
仅获取数字列:
print (df[columns].select_dtypes(np.number))
B C E
0 0.0 7 5
1 0.0 8 3
2 NaN 9 6
3 0.0 4 9
4 0.0 2 2
5 0.0 3 4
然后将0
的缺失值替换为DataFrame.fillna
:
print (df[columns].select_dtypes(np.number).fillna(0))
B C E
0 0.0 7 5
1 0.0 8 3
2 0.0 9 6
3 0.0 4 9
4 0.0 2 2
5 0.0 3 4
通过DataFrame.eq
与==
进行比较:
print (df[columns].select_dtypes(np.number).fillna(0).eq(0))
B C E
0 True False False
1 True False False
2 True False False
3 True False False
4 True False False
5 True False False
通过DataFrame.all
测试所有列是否仅是True
:
print (df[columns].select_dtypes(np.number).fillna(0).eq(0).all())
B True
C False
E False
dtype: bool
最后测试Series.any
中True
中的系列中是否至少有一个:
print (df[columns].select_dtypes(np.number).fillna(0).eq(0).all().any())
True
答案 1 :(得分:0)
您也可以尝试这种情况:
if df[col].dtype == int or df[col].dtype == float:
#your code