问题:我该如何改进我的方法(“expand_traits”张贴在下面)或我试图使用的数据结构?我估计我的解决方案的运行时间是几个小时,这似乎是我在某个地方犯了很大的错误(考虑到收集所有数据需要大约10分钟,并且可能需要几个小时才能将其转换为我可以分析的内容)。
我收集了一些基本上是熊猫数据框的数据,其中表中的一些列是列表列表(技术上格式化为字符串,所以当我评估它们时,我使用
阿斯特。文字评估(列)
-如果相关的话)。
要稍微解释一下上下文:
数据包含传奇联盟TFT游戏模式的历史数据。我的目标是对它进行一些分析,根据列表中的每个项目进行分组,看看它们的平均表现如何。我真的只能从表格的角度来考虑,比如df。groupby(by='Trait')。mean()获得每个特质的平均获胜率,但我愿意接受其他想法。
以下是数据集的一个示例:
等级
|
召唤者
|
特点
|
单位
|
1.
|
名字1
|
['7名创新者','1名变形金刚','3名魔术师','2名社交名流','2名发条机','2名学者','2名废品']
|
['Ezreal'、'signed'、'Zilean'、'Taric'、'Heimerdinger'、'Janna'、'Orianna'、'Seraphine'、'Jayce']
|
2.
|
名字2
|
['1个可爱的','1个贪吃的','5个唯利是图的','4个布鲁瑟','6个化学技术','2个学者','1个社交名媛','2个双胞胎']
|
['Illaoi'、'Gangplank'、'MissFortune'、'Lissandra'、'Zac'、'Urgot'、'DrMundo'、'TahmKench'、'Yuumi'、'Viktor']
|
表中的总记录约为40000条(听起来不算太多),但我最初的想法是基本上将嵌套列表“unpivot”到它们自己的记录中。
我的想法有点像:
召唤者
|
特质
|
记录ID
|
名字1
|
7创新者
|
身份证1
|
名字1
|
1变压器
|
身份证1
|
...
|
...
|
...
|
名字2
|
1.可爱的
|
身份证2
|
名字2
|
1贪吃鬼
|
身份证2
|
由于每个列表中的项目数,此转换将把我的~40000条记录转换为几十万条。
def expand_traits(traits_df):
traits_df_expanded = pd.DataFrame()
for i in range(len(traits_df)):
traits = ast.literal_eval(traits_df.Traits[i])
for trait in traits:
record = {
'Summoner': traits_df.Summoner[i],
'Trait': trait,
'match_id': str(traits_df.match_id[i])
}
traits_df_expanded = traits_df_expanded.append(record, ignore_index=True)
这种方法合乎逻辑吗?还是我错过了什么。
我无法想象这是最佳的方法——我的expand_traits方法也可能出了问题。