[英]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()
您可以使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.