データフレーム内の文字列から数値を取り出す

How to place only part of string values in columns? – StackOverflow

pandas.DataFrame.apply(lambda x: x.str.extract)するだけの話.ただし,これは時間効率が悪いので(回答の方法もapplyと変わらないのでそうする意味はない;stack/unstackは重い),時間効率を気にする場合は,色々と工夫しないといけない.

import pandas as pd
import numpy as np
import re


def f(s):
    try:
        out = re.search(r'\[(\d+)\]', s)
        return out.group(1) if out else np.nan
    except TypeError:
        return np.nan


d = {'P': ['A[55]','B','C[98]"'],
     'Q': ['C[89]','F[98]','K[97]'],
     'S': ['B[89]',67,98],
     'id': ['a','b','c']
}
df = pd.DataFrame(d)
print(df, end='\n\n')

res = df.assign(**df.loc[:, 'P':'S'].astype(str).apply(lambda x: x.str.extract(r'\[(\d+)\]', expand=False)))
print(res, end='\n\n')

d2 = {k: [f(s) for s in v] if k in ['P', 'Q', 'S'] else v for k, v in d.items()}
res2 = pd.DataFrame(d2)
print(res2, end='\n\n')


df_ = pd.concat([df]*30000, ignore_index=True)
%timeit df=df_.copy();df.loc[:,'P':'S'] = df.loc[:,'P':'S'].astype(str).stack().str.extract(r'\[(\d+)\]', expand=True).unstack()[0]
%timeit df=df_.copy();res = df.assign(**df.loc[:, 'P':'S'].astype(str).apply(lambda x: x.str.extract(r'\[(\d+)\]', expand=False)))
%timeit d=df_.to_dict('list');d2 = {k: [f(s) for s in v] if k in ['P', 'Q', 'S'] else v for k, v in d.items()};res2 = pd.DataFrame(d2)
        P      Q      S id
0   A[55]  C[89]  B[89]  a
1       B  F[98]     67  b
2  C[98]"  K[97]     98  c

     P   Q    S id
0   55  89   89  a
1  NaN  98  NaN  b
2   98  97  NaN  c

     P   Q    S id
0   55  89   89  a
1  NaN  98  NaN  b
2   98  97  NaN  c

1 loop, best of 3: 432 ms per loop
1 loop, best of 3: 422 ms per loop
1 loop, best of 3: 371 ms per loop
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください