初心者のコーダーからの質問を初めて投稿し、提案や改善を受け入れます。
データフレームに新しい列を作成しようとしています。各行の新しい列は、次のように入力する必要があります。
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]
コメントを追加