Python 如何将字典的文本文件读入数据框

Python 如何将字典的文本文件读入数据框,python,pandas,dictionary,text,json-normalize,Python,Pandas,Dictionary,Text,Json Normalize,我有一个来自Clash Royale stats Kaggle的文本文件。它采用Python字典的格式。我正在努力找出如何以有意义的方式将其读入文件。我想知道最好的方法是什么。这是一个相当复杂的清单 此处为原始数据集: 我将您的数据保存到.json文件中,然后只需循环每一行,并将其作为自己的json文件处理,然后我将其加载到数据帧中,并对您希望df的外观进行了一些猜测,但我提出了以下建议: 注意:正确的JSON需要双引号,而不是单引号,所以我使用了replace来解决这个问题。请注意,使用此方

我有一个来自Clash Royale stats Kaggle的文本文件。它采用Python字典的格式。我正在努力找出如何以有意义的方式将其读入文件。我想知道最好的方法是什么。这是一个相当复杂的清单

此处为原始数据集:

我将您的数据保存到.json文件中,然后只需循环每一行,并将其作为自己的json文件处理,然后我将其加载到数据帧中,并对您希望df的外观进行了一些猜测,但我提出了以下建议:

注意:正确的JSON需要双引号,而不是单引号,所以我使用了replace来解决这个问题。请注意,使用此方法不会破坏内部数据

注意:我的工作方式是,我必须合并“右”和“左”,因此您将丢失这些数据。如果需要,您可以使用dict comp作为解决方法

这张照片是:

df.iloc[0]如下:

player.troop.name Mega Minion
player.troop.level         9
player.name         gpa raid
player.trophy           4258
player.clan       TwoFiveOne
Name: 0, dtype: object

你可以按照你认为合适的方式重新编写json_规范化参数,但我希望这足以让你继续

根据这个数据集,每个字典代表两个玩家之间的匹配。我觉得让数据帧中的每一行代表单个匹配的所有特征是有意义的

这可以通过几个简单的步骤来完成

将kaggle数据集中每行的所有匹配词典存储在一个列表中: 从上面的列表中创建一个dataframe,它将自动填充包含匹配类型、时间和结果信息的列: 然后,使用一些简单的逻辑填充包含牌组、奖杯、氏族以及比赛中左右双方球员姓名信息的列: 生成的数据帧如下所示:

    left_name   left_clan   left_trophy   left_deck                                           right_name    right_clan  right_trophy    right_deck                                          type    time         result
0   Supr4       battusai           4325   [[Fireball, 9], [Archers, 12], [Goblins, 12], ...   gpa raid      TwoFiveOne          4258    [[Mega Minion, 9], [Electro Wizard, 3], [Arrow...   ladder  2017-07-12   [2, 0]
1   Supr4       battusai           4296   [[Royal Giant, 13], [Ice Wizard, 2], [Bomber, ...   TITAN The     Wolves              4237    [[Ice Spirit, 10], [Valkyrie, 9], [Hog Rider, ...   ladder  2017-07-12   [1, 0]
2   Supr4       battusai           4267   [[Royal Giant, 13], [Ice Wizard, 2], [Bomber, ...   Victor        @LA PERLA NEGRA     4300    [[Miner, 3], [Ice Golem, 9], [Spear Goblins, 1...   ladder  2017-07-12   [0, 1]
其他答案仅适用于玩具数据,如OP中所示。此答案处理来自Kaggle的实际文件,以及如何清理它。 matches.txt是嵌套dict的行 在文件中,每行有4个顶级键,['players','type','result','time'] 在中读取文件,这将使每一行成为str类型 使用将其从str转换为dict类型 某些行的格式不正确,将导致语法错误 可以使用以下命令将数据转换为数据帧: 进口 作为pd进口熊猫 从ast导入文字值 清理文件 存储数据 数据=列表 把断行存起来 断行=列表 读入文件 打开'matches.txt','r',将='utf-8'编码为f: 读这些行 行=f.readlines 对于行中的行: 尝试将一行从字符串转换为dict 尝试: 行=文字\u evalrow data.appendrow 除SyntaxError外: 断行 持续 将数据转换为长数据帧 对于每场比赛,每个“玩家。右。牌组”、“玩家。左。牌组”都有一个单独的行。 将数据转换为数据帧 players=pd.json\u normalizedata 为每一行添加一个唯一的id,该id可用于识别特定游戏的玩家 df['id']=df.index 将right.deck和left.deck中的列表拆分为单独的行 players=df[['id','players.right.deck','players.left.deck']].applypd.Series.explode.reset\u indexdrop=True 删除原始列 df.dropcolumns=['players.right.deck','players.left.deck',inplace=True right.deck和left.deck仍然是一个包含两个值的列表,需要有单独的列 players[['right.deck.name','right.deck.number']=pd.DataFrameplayers.pop'players.right.deck.values.tolist players[['left.deck.name','left.deck.number']=pd.DataFrameplayers.pop'players.left.deck'.values.tolist 将结果列分隔为两列 df[['right.result','left.result']=pd.DataFramedf.pop'result'.values.tolist 与玩家合并 df=df.mergeplayers,on='id' df.head8 键入time players.right.trophy players.right.clam players.right.name players.left.trophy players.left.clan players.left.name id right.result left.result right.deck.name right.deck.number left.deck.name left.deck.number 0梯形图2017-07-12 4258 Two-FiveOne gpa突袭4325 battusai Supr4 0 2 0百万仆从9火球9 1梯形图2017-07-12 4258 Two-FiveOne gpa raid 4325 battusai Supr4 0 2 0电子向导3弓箭手12 2梯形图2017-07-12 4258 Two FiveOne gpa raid 4325 battusai Supr4 0 2 0箭头11地精12 3梯形图2017-07-12 4258 Two FiveOne gpa突袭4325 battusai Supr4 0 2 0 Lightning 5仆从 11 4梯形图2017-07-12 4258 Two-FiveOne gpa突袭4325 battusai Supr4 0 2 0墓碑9轰炸机12 5梯形图2017-07-12 4258 Two-FiveOne gpa raid 4325 battusai Supr4 0 2日志2日志2 6梯形图2017-07-12 4258 Two-FiveOne gpa突袭4325 battusai Supr4 0 2 0巨人9野蛮人12 7梯形图2017-07-12 4258 Two-FiveOne gpa突袭4325 battusai Supr4 0 2 0保龄球手5皇家巨人13 将数据转换为宽数据帧 此选项使用该函数。 对于每场比赛,每个“玩家。右。甲板”,“玩家。左。甲板”都有一个单独的栏。 将数据转换为宽数据帧 df=pd.DataFrame[将数据中的x展平] displaydf.head3 游戏玩家(游戏玩家)游戏玩家(游戏玩家)游戏游戏游戏游戏游戏游戏游戏游戏游戏游戏游戏游戏游戏游戏游戏游戏游戏玩家游戏游戏玩家游戏游戏玩家游戏游戏玩家游戏游戏游戏玩家游戏游戏游戏玩家游戏游戏游戏玩家游戏游戏玩家游戏游戏游戏玩家游戏游戏游戏游戏玩家游戏游戏游戏游戏游戏玩家游戏游戏玩家游戏游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家游戏玩家U 7_0玩家(右)右(右)右(右)右(右)右(右)右(右)甲(右)甲(右)甲(右)姓玩家玩家(左)甲(左)甲(甲)甲(甲)玩家(右)甲(右)甲(右)甲(右)甲(右)甲(右)甲(右)甲(右)甲(右)甲(右)甲(右)甲(右)甲(右)甲(右)甲)甲(右)甲)甲(甲)甲(甲)甲)甲)甲(甲)甲(甲)甲)甲(甲)甲)甲)甲)甲(甲)甲)甲(甲(甲)甲(甲)甲)甲(甲(甲)甲(甲)甲)甲)甲(甲)甲(甲)甲(甲)甲(甲(甲)甲(甲)甲(甲)甲)甲(甲)甲)甲(甲)甲(甲(甲(甲)甲)甲)甲)甲)甲)甲)甲一,玩家\u左牌\u 6 \u 0玩家\u左牌\u 6 \u 1玩家\u左牌\u 7 \u 0玩家\u左牌\u 7 \u 1玩家\u左牌\u奖杯玩家\u左牌\u部落玩家\u左牌\u姓名类型结果\u 0结果\u 1次 0百万仆从9电子巫师3箭11闪电5墓碑9原木2巨人9投球手5 4258 Two FiveOne gpa突袭火球9弓箭手12地精12仆从11轰炸机12原木2野蛮人12皇家巨人13 4325 battusai Supr4梯子2 0 2017-07-12 1冰精灵10 Valkyrie 9猪骑士9地狱塔9地精12火枪手9 Zap 12火球9 4237狼队泰坦皇家巨人13冰精灵2轰炸机12骑士12火球9野蛮人12原木2弓箭手12 4296 battusai Supr4梯子1 0 2017-07-12 2矿工3冰魔9矛地精12奴才部落12地狱之塔8原木2骷髅军6火球10 4300@LA PERLA NEGRA维克多皇家巨人13冰巫师2轰炸机12骑士12火球9野蛮人12原木2弓箭手12 4267 battusai Supr4梯子0 1 2017-07-12
   player.troop.name player.troop.level player.name      player.clan  \
0        Mega Minion                  9    gpa raid       TwoFiveOne   
1     Electro Wizard                  3    gpa raid       TwoFiveOne   
2             Arrows                 11    gpa raid       TwoFiveOne   
3          Lightning                  5    gpa raid       TwoFiveOne   
4          Tombstone                  9    gpa raid       TwoFiveOne   
5            The Log                  2    gpa raid       TwoFiveOne   
6              Giant                  9    gpa raid       TwoFiveOne   
7             Bowler                  5    gpa raid       TwoFiveOne   
8           Fireball                  9       Supr4         battusai   
9            Archers                 12       Supr4         battusai   
10           Goblins                 12       Supr4         battusai   
11           Minions                 11       Supr4         battusai   
12            Bomber                 12       Supr4         battusai   
13           The Log                  2       Supr4         battusai   
14        Barbarians                 12       Supr4         battusai   
15       Royal Giant                 13       Supr4         battusai   
0         Ice Spirit                 10       TITAN       The Wolves   
1           Valkyrie                  9       TITAN       The Wolves   
2          Hog Rider                  9       TITAN       The Wolves   
3      Inferno Tower                  9       TITAN       The Wolves   
4            Goblins                 12       TITAN       The Wolves   
5          Musketeer                  9       TITAN       The Wolves   
6                Zap                 12       TITAN       The Wolves   
7           Fireball                  9       TITAN       The Wolves   
8        Royal Giant                 13       Supr4         battusai   
9         Ice Wizard                  2       Supr4         battusai   
10            Bomber                 12       Supr4         battusai   
11            Knight                 12       Supr4         battusai   
12          Fireball                  9       Supr4         battusai   
13        Barbarians                 12       Supr4         battusai   
14           The Log                  2       Supr4         battusai   
15           Archers                 12       Supr4         battusai   
0              Miner                  3      Victor  @LA PERLA NEGRA   
1          Ice Golem                  9      Victor  @LA PERLA NEGRA   
2      Spear Goblins                 12      Victor  @LA PERLA NEGRA   
3       Minion Horde                 12      Victor  @LA PERLA NEGRA   
4      Inferno Tower                  8      Victor  @LA PERLA NEGRA   
5            The Log                  2      Victor  @LA PERLA NEGRA   
6      Skeleton Army                  6      Victor  @LA PERLA NEGRA   
7           Fireball                 10      Victor  @LA PERLA NEGRA   
8        Royal Giant                 13       Supr4         battusai   
9         Ice Wizard                  2       Supr4         battusai   
10            Bomber                 12       Supr4         battusai   
11            Knight                 12       Supr4         battusai   
12          Fireball                  9       Supr4         battusai   
13        Barbarians                 12       Supr4         battusai   
14           The Log                  2       Supr4         battusai   
15           Archers                 12       Supr4         battusai   

   player.trophy  
0           4258  
1           4258  
2           4258  
3           4258  
4           4258  
5           4258  
6           4258  
7           4258  
8           4325  
9           4325  
10          4325  
11          4325  
12          4325  
13          4325  
14          4325  
15          4325  
0           4237  
1           4237  
2           4237  
3           4237  
4           4237  
5           4237  
6           4237  
7           4237  
8           4296  
9           4296  
10          4296  
11          4296  
12          4296  
13          4296  
14          4296  
15          4296  
0           4300  
1           4300  
2           4300  
3           4300  
4           4300  
5           4300  
6           4300  
7           4300  
8           4267  
9           4267  
10          4267  
11          4267  
12          4267  
13          4267  
14          4267  
15          4267
player.troop.name Mega Minion
player.troop.level         9
player.name         gpa raid
player.trophy           4258
player.clan       TwoFiveOne
Name: 0, dtype: object
matches = [
{'players': {'right': {'deck': [['Mega Minion', '9'], ['Electro Wizard', '3'], ['Arrows', '11'], ['Lightning', '5'], ['Tombstone', '9'], ['The Log', '2'], ['Giant', '9'], ['Bowler', '5']], 'trophy': '4258', 'clan': 'TwoFiveOne', 'name': 'gpa raid'}, 'left': {'deck': [['Fireball', '9'], ['Archers', '12'], ['Goblins', '12'], ['Minions', '11'], ['Bomber', '12'], ['The Log', '2'], ['Barbarians', '12'], ['Royal Giant', '13']], 'trophy': '4325', 'clan': 'battusai', 'name': 'Supr4'}}, 'type': 'ladder', 'result': ['2', '0'], 'time': '2017-07-12'},
{'players': {'right': {'deck': [['Ice Spirit', '10'], ['Valkyrie', '9'], ['Hog Rider', '9'], ['Inferno Tower', '9'], ['Goblins', '12'], ['Musketeer', '9'], ['Zap', '12'], ['Fireball', '9']], 'trophy': '4237', 'clan': 'The Wolves', 'name': 'TITAN'}, 'left': {'deck': [['Royal Giant', '13'], ['Ice Wizard', '2'], ['Bomber', '12'], ['Knight', '12'], ['Fireball', '9'], ['Barbarians', '12'], ['The Log', '2'], ['Archers', '12']], 'trophy': '4296', 'clan': 'battusai', 'name': 'Supr4'}}, 'type': 'ladder', 'result': ['1', '0'], 'time': '2017-07-12'},
{'players': {'right': {'deck': [['Miner', '3'], ['Ice Golem', '9'], ['Spear Goblins', '12'], ['Minion Horde', '12'], ['Inferno Tower', '8'], ['The Log', '2'], ['Skeleton Army', '6'], ['Fireball', '10']], 'trophy': '4300', 'clan': '@LA PERLA NEGRA', 'name': 'Victor'}, 'left': {'deck': [['Royal Giant', '13'], ['Ice Wizard', '2'], ['Bomber', '12'], ['Knight', '12'], ['Fireball', '9'], ['Barbarians', '12'], ['The Log', '2'], ['Archers', '12']], 'trophy': '4267', 'clan': 'battusai', 'name': 'Supr4'}}, 'type': 'ladder', 'result': ['0', '1'], 'time': '2017-07-12'}
]
df = pd.DataFrame(matches)
sides = ['right', 'left']
player_keys = ['deck', 'trophy', 'clan', 'name']

for side in sides:
    for key in player_keys:
        for i, row in df.iterrows():
            df[side + '_' + key] = df['players'].apply(lambda x: x[side][key])

df = df.drop('players', axis=1) # no longer need this after populating the other columns

df = df.iloc[:, ::-1] # made sense to display columns in order of player info from left to right,
                      # followed by general match info at the far right of the dataframe
    left_name   left_clan   left_trophy   left_deck                                           right_name    right_clan  right_trophy    right_deck                                          type    time         result
0   Supr4       battusai           4325   [[Fireball, 9], [Archers, 12], [Goblins, 12], ...   gpa raid      TwoFiveOne          4258    [[Mega Minion, 9], [Electro Wizard, 3], [Arrow...   ladder  2017-07-12   [2, 0]
1   Supr4       battusai           4296   [[Royal Giant, 13], [Ice Wizard, 2], [Bomber, ...   TITAN The     Wolves              4237    [[Ice Spirit, 10], [Valkyrie, 9], [Hog Rider, ...   ladder  2017-07-12   [1, 0]
2   Supr4       battusai           4267   [[Royal Giant, 13], [Ice Wizard, 2], [Bomber, ...   Victor        @LA PERLA NEGRA     4300    [[Miner, 3], [Ice Golem, 9], [Spear Goblins, 1...   ladder  2017-07-12   [0, 1]