DataFrameの列を部分文字列のリストの1つに一致させようとしています。
たとえばstrings
、次の値を持つ列()を取得します。
text1C1
text2A
text2
text4
text4B
text4A3
そして、それらを次の部分文字列に一致させる新しい列を作成します。
vals = ['text1', 'text2', 'text3', 'text4', 'text4B']
私が現在持っているコードは機能しますが、問題を解決するための本当に非効率的な方法のようです。
df = pd.DataFrame({'strings': ['text1C1', 'text2A', 'text2', 'text4', 'text4B', 'text4A3']})
for v in vals:
df.loc[df[df['strings'].str.contains(v)].index, 'matched strings'] = v
これにより、次のDataFrameが返されます。これが必要です。
strings matched strings
0 text1C1 text1
1 text2A text2
2 text2 text2
3 text4 text4
4 text4B text4B
5 text4A3 text4
特に大きなデータフレーム(1万行以上)の場合、これを行うためのより効率的な方法はありますか?
vals
別の部分文字列でもある(text4
の部分文字列であるtext4B
)項目の1つをどのように処理するかを考えることができません
next
最初の値を一致させるためにジェネレーターを使用します。
s = vals[::-1]
df['matched strings1'] = df['strings'].apply(lambda x: next(y for y in s if y in x))
print (df)
strings matched strings matched strings1
0 text1C1 text1 text1
1 text2A text2 text2
2 text2 text2 text2
3 text4 text4 text4
4 text4B text4B text4B
5 text4A3 text4 text4
可能であれば、より一般的な解決策。一致する値がなくiter
、デフォルトのパラメータがnext
:
f = lambda x: next(iter(y for y in s if y in x), 'no match')
df['matched strings1'] = df['strings'].apply(f)
ソリューションを改善する必要があります。
for v in vals:
df.loc[df['strings'].str.contains(v, regex=False), 'matched strings'] = v
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加