方法としては、
1. df
の各行を引数に受け取り、突合判定の結果True
となったarea
を Series
型で返す関数を
Python
1def check(row):
2 x = row['x']
3 y = row['y']
4 # ここで、df_area と判定を行い 下記のように対応する``area``をSeries型で返す
5 return pd.Series(['a', 'b'])
のように実装する
2. この関数を df.apply()
で呼び、その結果を stack()
する
3. 上記の結果を元のdf
と結合する
で望んだ結果が得られるかと思います。
以下サンプル
import pandas as pd
import io
import numpy as np
df = pd.read_csv(io.StringIO("""
x,y
440,495
440,462
451,507
449,507
443,506
"""))
# このサンプルでは使っていないが一応・・
df_area = pd.read_csv(io.StringIO("""
x1,y1,x2,y2,x3,y3,x4,y4,area
556,250,2371,250,2371,672,556,672,a
551,261,555,675,563,680,577,711,b
511,257,2322,256,2322,680,511,680,c
543,86,2311,86,2311,515,543,515,d
"""))
# df_area の各エリアとの突合判定を行う関数
def check(data):
### サンプルとしては、ランダムでareaを返す ###
# 対応するareaの数(ランダムで1~2個)
n = np.random.randint(1,3)
# ランダムで``area``のSeriesを返す(重複がある可能性があるがサンプルなので無視)
return pd.Series(np.random.choice(['a','b','c','d','e','f'],n))
# 判定結果をstack()する
ret = df.apply(check, axis=1).stack().reset_index(level=1, drop=True).rename('area')
# 元のDataFrameと結合
ret = df.join(ret)
print(ret)
# x y area
#0 440 495 d
#1 440 462 a
#2 451 507 b
#2 451 507 a
#3 449 507 f
#4 443 506 a
#4 443 506 d
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/26 01:49
2019/10/08 10:09 編集