首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建包含两个exisitng dataframes之间多个列的值更改的新dataframe

如何创建包含两个exisitng dataframes之间多个列的值更改的新dataframe
EN

Stack Overflow用户
提问于 2022-06-29 14:51:40
回答 3查看 44关注 0票数 0

我在看足球运动员在五年内的发展。

我有两个数据处理程序(DFs),一个包含来自国际足联17的所有20岁的前锋,另一个包含国际足联22的所有25岁的前锋。我想要创建第三个DF,它包含每个玩家的属性更改。有大约30列代表每个属性,如攻防,投篮,传球等。所以我希望新的DF包含+3的攻防,+2的投篮,+6的传球等等。

我能想到的解决这个问题的最好方法是合并两个DFs,然后对每个列应用一个函数,给出x值和y值之间的差额,分别表示FIFA 17和FIFA 22的数据。

任何小费都很感激。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-30 07:36:04

如前所述,使用数据格式的差异。我怀疑它们不是ALL NaN值,因为只有在同样的球员不在17和22国际足联的情况下,你才能得到这样的值。

当我这么做的时候,17岁和22岁的球员只有533人(在国际足联17岁时只有20岁,在22岁时只有25岁)。

下面是一个例子:

将熊猫作为pd导入

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
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]
票数 0
EN

Stack Overflow用户

发布于 2022-06-29 14:56:43

您可以考虑下面的简单示例来减去pandas.DataFrame

代码语言:javascript
复制
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)

给予输出

代码语言:javascript
复制
    X   Y
0   9  27
1  18  36
票数 0
EN

Stack Overflow用户

发布于 2022-06-29 15:53:57

我已经找到了一个解决方案,但它非常繁琐,因为它需要为每个属性编写一行代码。

我只是为每个属性更改分配一个新列。例如,对于传递,代码是:

代码语言:javascript
复制
mergedDF = mergedDF.assign(PassingChange = mergedDF.Passing_x - mergedDF.Passing_y)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72803474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档