0

たくさんのバスケットボール データを照合する大きなデータフレームがあります (下のスクリーンショット)。Opp Lineup の右側にあるすべての列は、そのプレーヤー (列名で示される) が現在のラインナップに含まれているかどうかを示すダミー変数です (列名の最後の部分はチーム名であり、対戦相手の列と比較する必要があります)。異なるチームで同じ番号と名前を持つ 2 人のプレイヤーが混乱しないようにしてください)。pandas データフレーム (iterrows、itertuples、iteritems) を反復処理するいくつかの方法を知っていますが、必要なことを達成する方法がわかりません。これは、各列の各行です。

  1. チーム (columnname.split()[2:]) を対戦相手の列と比較します (LSU プレーヤーを除く)。
  2. 名前 (columnname.split()[:2]) が Opp ラインナップにあるかどうか、または LSU プレーヤーの場合はラインナップにあるかどうかを確認します
  3. 上記の条件が満たされている場合、その値を 1 に置き換え、それ以外の場合は 0 のままにします

ここに画像の説明を入力

データフレームをループしてこのタスクを達成するための最良の方法は何ですか? この場合、速度はあまり重要ではありません。関連するすべてのロジックを理解していますが、パンダをループする方法を知るのに十分な知識がなく、Google で見たさまざまなことを試してもうまくいきません。

4

2 に答える 2

1

データはワイド フォーマットですが、ロング フォーマットでは行ごとに値を比較する必要があるため、リシェイプ/ピボット ソリューションを検討してください。したがって、最初にデータを溶かして、すべての列ヘッダーが実際の列'Player'になり、それに対応する値が'IsInLineup'. ダミー値の条件付き比較を実行してから、列ヘッダー全体でプレーヤーを含む元の構造に戻ります。もちろん、この例を完全にテストするための実際のデータはありません。

# MELT 
reshapedf = pd.melt(df, id_vars=['Opponent', 'Lineup', 'Minutes', 'Plus Minus', 
                                 'Plus Minus Per Minute', 'Opp Lineup'], 
                    var_name='Player', value_name='IsInLineup')

# APPLY FUNCTION (SPLITTING VALUE AND THEN JOINING FOR SUBSET STRING)
reshapedf['IsInLineup'] = reshapedf.apply(lambda row: (' '.join(row['Player'].split(' ')[:2]) in row['Opp Lineup'] and
                                                       ' '.join(row['Player'].split(' ')[2:]) in row['Opponent'])*1, axis=1)

# PIVOT (UNMELT)
df2 = reshapedf.pivot_table(index=['Opponent', 'Lineup', 'Minutes', 'Plus Minus', 
                                   'Plus Minus Per Minute', 'Opp Lineup'], columns='Player').reset_index()
df2.columns = df2.columns.droplevel(0).rename(None)
df2.columns = df.columns

上記のラムダ関数が少し複雑に見える場合は、同等の定義された function() を適用してみてください:

# APPLY FUNCTION (SPLITTING VALUE AND THEN JOINING FOR SUBSET STRING)
def f(row):
    if (' '.join(row['Player'].split(' ')[:2]) in row['Opp Lineup'] and \
        ' '.join(row['Player'].split(' ')[2:]) in row['Opponent']):
        return 1
    else:
        return 0

reshapedf['IsInLineup'] = reshapedf.apply(f,axis=1)
于 2016-02-16T23:32:41.113 に答える
0

私は最終的に回避策を使用しました。私は df.iterrows を使用して繰り返し、必要な値をチェックしてから、一時リストに 0 または 1 を追加する各繰り返しのリストを作成しました。次に、それをデータフレームに挿入しました。おそらくメモリに関しては最も効率的ではありませんが、うまくいきました。

于 2016-02-25T23:22:24.813 に答える