Python:データフレーム内の複数の列に1つの特定の文字列以外の値がある場合は、新しい列の値を設定します

valencia21

初心者のコーダーからの質問を初めて投稿し、提案や改善を受け入れます。

データフレームに新しい列を作成しようとしています。各行の新しい列は、次のように入力する必要があります。

1)その行の選択列にすべて値「なし」が含まれている場合は「不明」。

2)列の1つにそのような値が含まれている場合、「なし」以外の値。

私が使用しているデータセットでは、行ごとに「なし」以外の値が1つだけあり、列名はセルの値と同じです。

各行をループして、それらの列で「なし」以外の値を見つけることができることはわかっています。見つかった場合は、列の値をその値に設定します(それ以外の場合は「不明」に設定します)が、簡単なものが不足しているように感じます。これを機能させます。

.loc / .iloc / .atやその他のいくつかの方法で値を選択することを検討しましたが、近づいているようには感じません。

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': ['None', 'None', 'None', 'None'],
                   'B': ['None', 'B', 'None', 'None'],
                   'C': ['None', 'None', 'C', 'None'],
                   'D': ['None', 'None', 'None', 'D']})

values = ['B', 'C', 'D']

#In the code below, replace the string  'This should be non-None value (B, C or D)' with an expression
df['Letter'] = pd.np.where(df[values].eq(values).any(1, skipna=True), 
                           'This should be non-None value (B, C or D)', 'Unknown')
print(df)

   A     B     C     D     Letter
0  None  None  None  None  Unknown                                  
1  None  B     None  None  This should be non-None value (B, C or D)
2  None  None  C     None  This should be non-None value (B, C or D)
3  None  None  None  D     This should be non-None value (B, C or D)
ジェズリール

私は必要だと信じています:

df['Letter'] = df.ne('None').dot(df.columns).replace('', 'Unknown')
#if None are not strings
#df['Letter'] = df.notna().dot(df.columns).replace('', 'Unknown')
#oldier pandas versions
#df['Letter'] = df.notnull().dot(df.columns).replace('', 'Unknown')
print(df)
      A     B     C     D   Letter
0  None  None  None  None  Unknown
1  None     B  None  None        B
2  None  None     C  None        C
3  None  None  None     D        D

説明

)または:でNone比較してのないブールマスクを取得しますDataFrame.ne!=DataFrame.notna

print(df.ne('None'))
       A      B      C      D
0  False  False  False  False
1  False   True  False  False
2  False  False   True  False
3  False  False  False   True

次にDataFrame.dot、列名とともに使用します。

print(df.ne('None').dot(df.columns))
0     
1    B
2    C
3    D
dtype: object

最後に、欠落している値をSeries.replace次のように置き換えます

print(df.ne('None').dot(df.columns).replace('', 'Unknown'))
0    Unknown
1          B
2          C
3          D
dtype: object

別の解決策:

df['Letter'] = df.replace('None', np.nan).ffill(axis=1).iloc[:, -1].fillna('Unknown')
print(df)
      A     B     C     D   Letter
0  None  None  None  None  Unknown
1  None     B  None  None        B
2  None  None     C  None        C
3  None  None  None     D        D

説明

必要に応じて、最初のreplace文字列Noneから欠落値へ:

print (df.replace('None', np.nan))
    A    B    C    D
0 NaN  NaN  NaN  NaN
1 NaN    B  NaN  NaN
2 NaN  NaN    C  NaN
3 NaN  NaN  NaN    D

欠落している値を前方に埋める:

print (df.replace('None', np.nan).ffill(axis=1))
     A    B    C    D
0  NaN  NaN  NaN  NaN
1  NaN    B    B    B
2  NaN  NaN    C    C
3  NaN  NaN  NaN    D

次の位置で最後の列を選択しますDataFrame.iloc

print (df.replace('None', np.nan).ffill(axis=1).iloc[:, -1])
0    NaN
1      B
2      C
3      D
Name: D, dtype: object

最後に、欠落している値をSeries.fillna次のように置き換えます

print (df.replace('None', np.nan).ffill(axis=1).iloc[:, -1].fillna('Unknown'))
0    Unknown
1          B
2          C
3          D
Name: D, dtype: object

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ