簡體   English   中英

如何創建一個新的數據框,其中包含兩個現有數據框之間多列的值更改

[英]How to create a new dataframe that contains the value changes from multiple columns between two exisitng dataframes

我正在研究五年內足球運動員的發展。

我有兩個數據框 (DF),一個包含來自 FIFA 17 的所有 20 歲前鋒,另一個包含來自 FIFA 22 的所有 25 歲前鋒。我想創建第三個 DF,其中包含每個球員的屬性變化。 大約有 30 列表示每個屬性,例如鏟球、射門、傳球等。所以我希望新的 DF 包含 +3 用於鏟球,+2 用於射門,+6 用於傳球等。

我能想到的解決這個問題的最佳方法是合並兩個 DF,然后對每一列應用一個函數,給出 x 和 y 值之間的差異,它們分別代表 FIFA 17 和 FIFA 22 數據。

非常感謝任何提示。 謝謝你。

您可以減去pandas.DataFrame考慮以下簡單示例

import pandas as pd
df1 = pd.DataFrame({'X':[1,2],'Y':[3,4]})
df2 = pd.DataFrame({'X':[10,20],'Y':[30,40]})
dfdiff = df2 - df1
print(dfdiff)

給出輸出

    X   Y
0   9  27
1  18  36

我找到了一個解決方案,但它非常繁瑣,因為它需要為每個屬性編寫一行代碼。

我只是為每個屬性更改分配一個新列。 因此,對於 Passing,例如,代碼是:

mergedDF = mergedDF.assign(PassingChange = mergedDF.Passing_x - mergedDF.Passing_y)

如前所述,使用數據幀的差異。 我懷疑它們不是所有的 NaN 值,因為您只會在同一球員不在 17 和 22 國際足聯中的行中得到它。

當我這樣做時,17 年和 22 年只有 533 名球員(在國際足聯 17 和國際足聯 22 中分別為 20 歲和 25 歲)。

這是一個例子:

將熊貓導入為 pd

fifa17 = pd.read_csv('D:/test/fifa/players_17.csv')
fifa17 = fifa17[fifa17['age'] == 20]
fifa17 = fifa17.set_index('sofifa_id')

fifa22 = pd.read_csv('D:/test/fifa/players_22.csv')
fifa22 = fifa22[fifa22['age'] == 25]
fifa22 = fifa22.set_index('sofifa_id')

compareCols = ['pace', 'shooting', 'passing', 'dribbling', 'defending', 
               'physic', 'attacking_crossing', 'attacking_finishing', 
               'attacking_heading_accuracy', 'attacking_short_passing', 
               'attacking_volleys', 'skill_dribbling', 'skill_curve', 
               'skill_fk_accuracy', 'skill_long_passing', 
               'skill_ball_control', 'movement_acceleration', 
               'movement_sprint_speed', 'movement_agility', 
               'movement_reactions', 'movement_balance', 'power_shot_power', 
               'power_jumping', 'power_stamina', 'power_strength', 
               'power_long_shots', 'mentality_aggression', 
               'mentality_interceptions', 'mentality_positioning', 
               'mentality_vision', 'mentality_penalties', 
               'mentality_composure', 'defending_marking_awareness', 
               'defending_standing_tackle', 'defending_sliding_tackle']

df = fifa22[compareCols] - fifa17[compareCols]


df = df.dropna(axis=0)
df = pd.merge(df,fifa22[['short_name']], how = 'left', left_index=True, right_index=True)

輸出:

print(df)
           pace  shooting  ...  defending_sliding_tackle     short_name
sofifa_id                  ...                                         
205291     -1.0       0.0  ...                       3.0     H. Stengel
205988     -7.0       3.0  ...                      -1.0        L. Shaw
206086      0.0       8.0  ...                       5.0     H. Toffolo
206113     -2.0      21.0  ...                      -2.0      S. Gnabry
206463     -3.0       8.0  ...                       3.0     J. Dudziak
        ...       ...  ...                       ...            ...
236311     -2.0      -1.0  ...                      18.0         M. Rog
236393      2.0       5.0  ...                       0.0   Marc Cardona
236415      3.0       1.0  ...                       9.0      R. Alfani
236441     10.0      31.0  ...                      18.0      F. Bustos
236458      1.0       0.0  ...                       5.0  A. Poungouras

[533 rows x 36 columns]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM