带有混合dtypes的pandas条件逻辑

时间:2017-10-17 15:13:12

标签: python pandas

我有一个pandas数据帧如下:

foo bar
a   b
1   10
2   25
3   9

我想添加一个新列,如下所示:

foo bar baz
a   b   0
1   10  1
2   25  1
3   9   1

这是: 如果row ['foo']或row ['bar]是数字,那么row ['baz'] = 1 else 0

到目前为止我所拥有的是:

def some_function(row):
   if row['foo']>=0 or row['bar']>=0:
      return 1
   return 0

df['baz'] = df.apply(lambda row: some_function(row), axis=1

但这不起作用,因为dtype不是int。 我无法删除non-int行,因为我需要在数据框中使用它们。

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:5)

如果要将数字保存为字符串,请使用to_numeric,然后与>=True)进行比较并使用all检查所有值是否为df['baz'] = df.apply(pd.to_numeric, errors='coerce').ge(0).all(1).astype(int) print (df) foo bar baz 0 a b 0 1 1 10 1 2 2 25 1 3 3 9 1 每行:

df['baz'] = (pd.to_numeric(df['foo'], errors='coerce').ge(0) | 
            pd.to_numeric(df['bar'], errors='coerce').ge(0)).astype(int)

或者如果需要单独检查列:

df['baz'] = df.apply(pd.to_numeric, errors='force').notnull().all(1).astype(int)

谢谢,Zero for check for check numeric:

type

但是如果需要带字符串的数字比较df = pd.DataFrame({'foo': ['a', 1, 2, 3], 'bar': ['b', 10, 25, 9]}) df['baz'] = (df.applymap(type) == str).all(1).astype(int) print (df) bar foo baz 0 b a 1 1 10 1 0 2 25 2 0 3 9 3 0

print (df.applymap(type))
             bar            foo
0  <class 'str'>  <class 'str'>
1  <class 'int'>  <class 'int'>
2  <class 'int'>  <class 'int'>
3  <class 'int'>  <class 'int'>

详情:

{{1}}