行を反復処理するよりも、行とメタデータからパンダデータフレーム列にデータを入力するためのより良い(おそらくSQLっぽい)方法をお願いします

PlanetAtkinson

私のデータは次のようになります。

import pandas as pd
codes = ['a', 'b', 'c']
to_flatten = [[c] * 6 for c in codes]
nums = [1, 2, 3, 4, 5, 6]
data_df = pd.DataFrame({'code': [item for subl in to_flatten for item in subl], 'num': nums * 3})

pandas.groupby()プロセスを使用してメタデータを生成したため、次のようになります。

meta_df = pd.DataFrame({'code': codes, 'start_at': [3, 2, 2], 'end_at': [5, 3, 2]})

さて、私のメタデータが次のようになったら:

meta_dict = {'a': (3, 5), 'b': (1, 3), 'c': (2, 2)}

私は簡単に書くことができます:

def f(row):
    start_at, end_at = meta_dict[row['code']]
    if start_at <= row['num'] <= end_at:
        return 1
    return 0
data_df['valid'] = data_df.apply(f, axis=1)
print(data_df)

私が持っているmeta_dfデータフレーム形式のメタデータを直接使用する別のパンダ指向の方法があるはずであり、data_df全体をループするよりもおそらく効率的だと思います。しかし、何ですか?

より良いアプローチはありますか、それともmeta_dfから各コードの値を絞り込み、data_dfの行で関数f()を繰り返し処理する必要がありますか?

フェリス
dfn = pd.merge(data_df, meta_df, on='code', how='left')
dfn['valid'] = np.where(dfn['num'].between(dfn.start_at, dfn.end_at), 1, 0)
print(dfn)
   code  num  start_at  end_at  valid
0     a    1         3       5      0
1     a    2         3       5      0
2     a    3         3       5      1
3     a    4         3       5      1
4     a    5         3       5      1
5     a    6         3       5      0
6     b    1         2       3      0
7     b    2         2       3      1
8     b    3         2       3      1
9     b    4         2       3      0
10    b    5         2       3      0
11    b    6         2       3      0
12    c    1         2       2      0
13    c    2         2       2      1
14    c    3         2       2      0
15    c    4         2       2      0
16    c    5         2       2      0
17    c    6         2       2      0

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

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

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ