これを出発点として使用:
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
を使用するように言っていますが、例はありません...
np.where を使用できます。 cond
がブール配列であり、A
およびB
が配列の場合、
C = np.where(cond, A, B)
cをA
がcond
がTrueであり、B
がcond
が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
列またはデータフレーム全体に.equals
を使用できます。
df['col1'].equals(df['col2'])
それらが等しい場合、そのステートメントはTrue
を返し、そうでない場合はFalse
を返します。
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)
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
値を他の値に置き換える場合は、新しい列fillna
でque
メソッドを使用できます。ここでは、空の文字列の代わりに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
個々の条件を括弧で囲み、&
演算子を使用して条件を結合します。
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
データフレームからチェックする複数の条件があり、特定の選択肢を別の列に出力する場合は、np.select
を使用します
conditions=[(condition1),(condition2)]
choices=["choice1","chocie2"]
df["new column"]=np.select=(condtion,choice,default=)
注:条件と選択肢のいずれも一致する必要はありません。2つの異なる条件で同じ選択肢がある場合は、選択したテキストを繰り返します
OPの直観に最も近いのはインラインifステートメントだと思います。
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three']))