社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何构造此数据集以进行分析和可视化?(有些列包含列表而不是单个值——Python和Pandas)

Robert Buttery • 3 年前 • 1306 次点击  

问题:我该如何改进我的方法(“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方法也可能出了问题。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129442
 
1306 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Corralien
Reply   •   1 楼
Corralien    3 年前

使用 explode :

cols = ['Summoner', 'Traits', 'Record_ID']
out = df.assign(Record_ID='id_' + df['Rank'].astype(str))[cols] \
        .explode('Traits', ignore_index=True) \
        .rename(columns={'Traits': 'Trait'})
print(out)

# Output:
   Summoner          Trait Record_ID
0     name1    7 Innovator      id_1
1     name1  1 Transformer      id_1
2     name1    3 Enchanter      id_1
3     name1    2 Socialite      id_1
4     name1    2 Clockwork      id_1
5     name1      2 Scholar      id_1
6     name1        2 Scrap      id_1
7     name2       1 Cuddly      id_2
8     name2      1 Glutton      id_2
9     name2    5 Mercenary      id_2
10    name2      4 Bruiser      id_2
11    name2     6 Chemtech      id_2
12    name2      2 Scholar      id_2
13    name2    1 Socialite      id_2
14    name2     2 Twinshot      id_2