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

我是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 = positions

previous = None

for p in position_columns:

    merged = carry.merge(right = players, left_on = p, right_on = 'position_ID', suffixes = [previous, p] )


    carry = merged

    previous = p


carry.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 不会花费太长时间。


话虽这么说,我正在做这个项目的一部分是为了学习熊猫。我想看看是否有更清洁的方法可以做到这一点。


红颜莎娜
浏览 156回答 2
2回答

胡子哥哥

您可以使用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_IDprimary_key                                                                                                                                                            a                   ida         ide         idg                  70                  74                  76                 200                 204                 206b                   idb         idb         idf                  71                  71                  75                 201                 201                 205c                   idc         idg         idc                  72                  76                  72                 202                 206                 202d                   idd         idd         idh                  73                  73                  77                 203                 203                 207
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python