为了账号安全,请及时绑定邮箱和手机立即绑定

寻找一种更简洁的方式来使用 Pandas 实施此解决方案

寻找一种更简洁的方式来使用 Pandas 实施此解决方案

红颜莎娜 2021-05-30 01:29:13
我是Pandas的新手,并试图将有关神经网络问题的训练数据汇总在一起。本质上,我有2个DataFrame:一个 DataFrame 有一个用于 primary_key 的列和用于 3 个不同位置的 3 列(运动位置,对于本示例,如果您愿意,假设为一垒、二垒、三垒)。每个位置都有该位置的玩家的玩家 ID。在第二个DataFrame上,我有每个球员的各种统计数据,例如身高和体重。我的最终目标是将第二个DataFrame中的列添加到第一个DataFrame中,以便每个位置具有与特定玩家相关的身高和体重(以列表示)。然后,我要将这个 DataFrame 导出为 csv,按特定顺序排列列,并将其用于我的训练数据,其中每一列是一个训练特征,每一行是一个训练集。我已经找到了一个解决方案,但我想知道我是否以最有效的方式来做,充分利用 Pandas 的功能和特性。这是我的代码的样子: ****编辑:我应该指出,这只是我的代码外观的简化。实际上,我的 DataFrame 是从 CSV 中提取的,而不是从我自己创建的字典中构建的。****import pandas as pd  dict_1 = {'primary_key' : ['a', 'b', 'c', 'd'],          'position_1_ID' : ['ida', 'idb', 'idc', 'idd'],          'position_2_ID' : ['ide', 'idb', 'idg', 'idd'],          'position_3_ID' : ['idg', 'idf', 'idc', 'idh']}dict_2 = {'position_ID' : ['ida', 'idb', 'idc', 'idd', 'ide', 'idf', 'idg', 'idh'],          'Height' : ['70', '71', '72', '73', '74', '75', '76', '77'],          'Weight' : ['200', '201', '202', '203', '204', '205', '206', '207']}positions = pd.DataFrame(dict_1)players = pd.DataFrame(dict_2)position_columns = ['position_1_ID', 'position_2_ID', 'position_3_ID']carry = positionsprevious = Nonefor p in position_columns:    merged = carry.merge(right = players, left_on = p, right_on = 'position_ID', suffixes = [previous, p] )    carry = merged    previous = pcarry.to_csv()运行此代码后,我有一个包含以下列的 DataFrame:'首要的关键''位置_1_ID'“ position_2_ID”'position_3_ID''position_IDposition_1_ID''position_IDposition_2_ID''position_IDposition_3_ID''高度位置_1_ID''权重位置_1_ID''高度位置_2_ID''重量位置_2_ID''Heightposition_3_ID''Weightposition_3_ID'这并不漂亮,但这使我能够最终导出具有特定列顺序的 csv,并且生成 DataFrame 不会花费太长时间。话虽这么说,我正在做这个项目的一部分是为了学习熊猫。我想看看是否有更清洁的方法可以做到这一点。
查看完整描述

2 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

您可以使用melt,merge和unstack:


df_out = carry.melt('primary_key')\

              .merge(players, left_on='value', right_on='position_ID')\

              .set_index(['primary_key','variable'])\

              .drop('value', axis=1)\

              .unstack()


df_out.columns = [f'{i}{j}' if i != 'position_ID' else f'{i}' for i,j in df_out.columns]

print(df_out)

输出:


            position_ID position_ID position_ID Heightposition_1_ID Heightposition_2_ID Heightposition_3_ID Weightposition_1_ID Weightposition_2_ID Weightposition_3_ID

primary_key                                                                                                                                                            

a                   ida         ide         idg                  70                  74                  76                 200                 204                 206

b                   idb         idb         idf                  71                  71                  75                 201                 201                 205

c                   idc         idg         idc                  72                  76                  72                 202                 206                 202

d                   idd         idd         idh                  73                  73                  77                 203                 203                 207



查看完整回答
反对 回复 2021-06-01
  • 2 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信