簡體   English   中英

尋找更干凈的方法來用Pandas實施此解決方案

[英]Looking for a cleaner way to implement this solution with 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:

'首要的關鍵'

'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。

話雖如此,我正在做這個項目的一部分是為了學習熊貓。 我想看看是否有更清潔的方法可以做到這一點。

謝謝!

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()

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM