2017-10-17 18 views
2

次のように私はパンダのデータフレームを持っている:パンダ条件ロジック

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 

です: 行であれば[ 'fooの']または行[' バー]が数値で、その行[ 'バズ'] =他の1 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行をデータフレームで必要とするため、削除できません。

どうすればこの問題を解決できますか?

答えて

5

文字列は、その後ge>=)と比較し、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) 

しかし、文字列と数値が必要な場合は、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'> 
+0

(pd.to_numeric、エラー= '力')df.apply '必要にnotnull。 ().all(1).astype(int) 'おそらく。 – Zero

+0

@jezraelありがとう! 'foo'または 'bar'の値が5以上であるかどうかをどのように確認することができますか?上記の条件を適用するか? – Kvothe

+0

'ge(5)'を変更しました - 「それ以上」 – jezrael