仅当它们是数字时,才如何对列中的所有值求和?

时间:2019-03-27 09:59:22

标签: python pandas

我有以下代码:

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仅适用于数字列,并且应该忽略空行(如果有)?

2 个答案:

答案 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.anyTrue中的系列中是否至少有一个:

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