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



我是Pandas的新手,并试图为神经网络问题整理训练数据。

本质上,我有 2 个数据帧:

一个数据帧有一列用于primary_key,3 列用于 3 个不同的位置(运动位置,在本例中,如果需要,假设一垒、二垒、三垒(。 每个位置都有该位置的玩家的玩家 ID。

在第二个数据帧上,我为每个玩家提供了各种统计数据,例如身高和体重。

我的最终目标是将第二个数据帧中的列添加到第一个数据帧,以便每个位置都有以列表示的特定玩家的关联身高和体重。 然后,我将把这个数据帧导出为 csv,按特定顺序排列列,并将其用于我的训练数据,其中每一列都是一个训练特征,每一行都是一个训练集。 我已经制定了一个解决方案,但我想知道我是否以最有效的方式做到这一点,充分利用了 Pandas 的功能和特性。

这是我的代码的样子: 编辑:我应该指出,这只是对我的代码外观的简化。 实际上,我的数据帧是从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()

运行此代码后,我有一个包含以下列的数据帧:

"primary_key">

"position_1_ID">

"position_2_ID">

"position_3_ID">

"position_IDposition_1_ID">

"position_IDposition_2_ID">

"position_IDposition_3_ID">

"Heightposition_1_ID">

"Weightposition_1_ID">

"Heightposition_2_ID">

"Weightposition_2_ID">

"Heightposition_3_ID">

"Weightposition_3_ID">

它并不漂亮,但这使我能够最终导出具有特定列顺序的 csv,并且生成数据帧不需要

花费很长时间。话虽如此,我做这个项目部分是为了学习熊猫。 我想看看是否有更清洁的方法可以做到这一点。

谢谢!

您可以使用meltmergeunstack

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
height_dict = {k:v for k, v in zip(dict_2['position_ID'], dict_2['Height'])} 
weight_dict = {k:v for k, v in zip(dict_2['position_ID'], dict_2['Weight'])}
positions = pd.DataFrame(dict_1) 
positions['p1_height'] = positions['position_ID1'].map(height_dict) 

对于身高和体重的所有 3 个 ID,步骤相似。

您可以循环,而不是编写重复的类似步骤。

希望这有帮助。

positions.to_csv((

最新更新