1. ホーム
  2. python

[解決済み] pandasを使用して2つの列を比較する

2022-03-02 10:07:28

質問

これを起点に

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 文をpandas内で使用することができます。

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

基本的には、各行を if ステートメントを使用して、新しいカラムを作成します。

ドキュメントによると .all が、例がない...。

どのように解決するのですか?

を使用することができます。 np.where . もし cond はブーリアン配列であり AB が配列の場合

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'] いつ 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