現在、Excelのインポートから作成された2つのデータフレーム(AとBと呼びましょう)があります。両方とも異なる寸法といくつかの空/ NaNセルを持っています。Aが個々のモデル番号のデータであり、Bが注文情報のセットであるとします。Aのすべての行(一意のアイテム)について、そのアイテム番号の(場合によっては)複数の注文をBで検索し、対応する価格を平均して、各アイテムの平均価格を含む列をAに追加します。
アイテム番号は英数字であるため、文字列である必要があります。すべてのアイテムに注文/価格情報があるわけではないので、次のステップでそれらを削除します。これは大量のデータであるため、効率が理想的であるため、反復はおそらく正しい選択ではありません。前もって感謝します!
これが私がこれまでに持っているものです:
avgPrice = []
for index, row in dfA.iterrows():
def avg_unit_price(item_no, unit_price):
matchingOrders = []
for item, price in zip(item_no, unit_price):
if item == row['itemNumber']:
matchingOrders.append(price)
avgPrice.append(np.mean(matchingOrders))
avg_unit_price(dfB['item_no'], dfB['unit_price'])
dfA['avgPrice'] = avgPrice
一般に、ループはパフォーマンスが低いため、回避してください。簡単にベクトル化できない場合は、最後の手段としてpd.Series.applyを試すことができます。この場合、どちらも必要ありませんでした。
import pandas as pd
# B: pricing data
df_b = pd.DataFrame([['I1', 34.1], ['I2', 541.31], ['I3', 451.3], ['I2', 644.3], ['I3', 453.2]],
columns=['item_no', 'unit_price'])
# create avg price dictionary
item_avg_price = df_b.groupby('item_no', as_index=False).mean().set_index('item_no')['unit_price'].to_dict()
# A: product data
df_a = pd.DataFrame([['I1'], ['I2'], ['I3'], ['I4']], columns=['item_no'])
# map price info to product data
df_a['avgPrice'] = df_a['item_no'].map(item_avg_price)
# remove unmapped items
df_a = df_a[pd.notnull(df_a['avgPrice'])]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加