寻找使用Pandas实施此解决方案的更干净的方法

时间:2018-08-22 16:33:01

标签: python pandas dataframe

我是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。

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

谢谢!

2 个答案:

答案 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)

您可以使用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