我是Pandas的新手,并试图将有关神经网络问题的训练数据汇总在一起。
基本上,我有2个数据框:
一个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:
'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,并且不需要花费很长时间来生成DataFrame。
话说回来,我正在做这个项目,部分目的是为了学习熊猫。我想看看是否有更干净的方法可以做到这一点。
谢谢!
答案 0 :(得分:0)
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()
答案 1 :(得分:0)
您可以使用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