web-dev-qa-db-ja.com

pandasを使用して2つの列を比較します

これを出発点として使用:

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

Out[8]: 
  one  two three
0   10  1.2   4.2
1   15  70   0.03
2    8   5     0

パンダ内でifステートメントのようなものを使用したい。

if df['one'] >= df['two'] and df['one'] <= df['three']:
    df['que'] = df['one']

基本的に、ifステートメントを使用して各行をチェックし、新しい列を作成します。

ドキュメントは.allを使用するように言っていますが、例はありません...

56
Merlin

np.where を使用できます。 condがブール配列であり、AおよびBが配列の場合、

C = np.where(cond, A, B)

cをAcondがTrueであり、BcondがFalseであると定義します。

import numpy as np
import pandas as pd

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three'])
                     , df['one'], np.nan)

利回り

  one  two three  que
0  10  1.2   4.2   10
1  15   70  0.03  NaN
2   8    5     0  NaN

複数の条件がある場合は、代わりに np.select を使用できます。たとえば、df['que']df['two']のときにdf['one'] < df['two']に等しくする場合は、

conditions = [
    (df['one'] >= df['two']) & (df['one'] <= df['three']), 
    df['one'] < df['two']]

choices = [df['one'], df['two']]

df['que'] = np.select(conditions, choices, default=np.nan)

利回り

  one  two three  que
0  10  1.2   4.2   10
1  15   70  0.03   70
2   8    5     0  NaN

df['one'] >= df['two']がFalseのときにdf['one'] < df['two']と仮定できる場合、条件と選択肢は次のように簡略化できます。

conditions = [
    df['one'] < df['two'],
    df['one'] <= df['three']]

choices = [df['two'], df['one']]

df['one']またはdf['two']にNaNが含まれている場合、仮定は当てはまらない可能性があります。)


ご了承ください

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

文字列値でDataFrameを定義します。それらは数値に見えるので、これらの文字列を浮動小数点数に変換する方が良いかもしれません:

df2 = df.astype(float)

ただし、文字列は文字ごとに比較され、フロートは数値的に比較されるため、結果は変わります。

In [61]: '10' <= '4.2'
Out[61]: True

In [62]: 10 <= 4.2
Out[62]: False
77
unutbu

列またはデータフレーム全体に.equalsを使用できます。

df['col1'].equals(df['col2'])

それらが等しい場合、そのステートメントはTrueを返し、そうでない場合はFalseを返します。

43
ccook5760

Apply()を使用して、このようなことをすることができます

df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)

または、ラムダを使用したくない場合

def que(x):
    if x['one'] >= x['two'] and x['one'] <= x['three']:
        return x['one']
    else:
        ''
df['que'] = df.apply(que, axis=1)
22
Bob Haffner

1つの方法は、ブール系列を使用して列df['one']にインデックスを付けることです。これにより、Trueエントリがdf['one']と同じ行と同じ値を持ち、False値がNaNである新しい列が得られます。

ブール系列はifステートメントで指定されます(andの代わりに&を使用する必要があります):

>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
>>> df
    one two three   que
0   10  1.2 4.2      10
1   15  70  0.03    NaN
2   8   5   0       NaN

NaN値を他の値に置き換える場合は、新しい列fillnaqueメソッドを使用できます。ここでは、空の文字列の代わりに0を使用しました。

>>> df['que'] = df['que'].fillna(0)
>>> df
    one two three   que
0   10  1.2   4.2    10
1   15   70  0.03     0
2    8    5     0     0
8
Alex Riley

個々の条件を括弧で囲み、&演算子を使用して条件を結合します。

df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']

~( "not"演算子)を使用して一致を反転することで、一致しない行を埋めることができます。

df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''

&および~演算子は要素ごとに機能するため、andおよびnotではなく&および~を使用する必要があります。

最終結果:

df
Out[8]: 
  one  two three que
0  10  1.2   4.2  10
1  15   70  0.03    
2   8    5     0  
4
Marius

データフレームからチェックする複数の条件があり、特定の選択肢を別の列に出力する場合は、np.selectを使用します

conditions=[(condition1),(condition2)]
choices=["choice1","chocie2"]

df["new column"]=np.select=(condtion,choice,default=)

注:条件と選択肢のいずれも一致する必要はありません。2つの異なる条件で同じ選択肢がある場合は、選択したテキストを繰り返します

0
psn1997

OPの直観に最も近いのはインラインifステートメントだと思います。

df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) 
0
Nic Scozzaro