私のデータは次のようになります。
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]
コメントを追加