【问题标题】:filter dataframe by dict or json like column按 dict 或 json 之类的列过滤数据框
【发布时间】:2019-03-26 14:49:33
【问题描述】:

我有一个如下的数据框:

       score           pvpdate
0      {2: 29, 4: 24}  2018-05-23
1      {2: 23, 4: 24}  2018-05-29
2      {2: 36, 4: 25}  2018-05-23

我想过滤分数列并得到类似的结果

     score1      score2     pvpdate
0        29          24     2018-05-23
1        23          24     2018-05-29
2        36          25     2018-05-23

我该怎么做?我已经尝试过像 json 列这样 score 列的方法,但它不起作用。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    如果要从字典的键中提取列名pop,请使用DataFrame 构造函数并将列名更改为add_prefix,最后join 没有score 的所有列:

    df = pd.DataFrame(df.pop('score').values.tolist()).add_prefix('score').join(df)
    print (df)
       score2  score4     pvpdate
    0      29      24  2018-05-23
    1      23      24  2018-05-29
    2      36      25  2018-05-23
    

    如果想要通过已解析 DataFrame 的长度创建的列名称使用 f-strings:

    #if stored dictionary like strings
    df['score']=df['score'].map(ast.literal_eval) 
    
    df1 = pd.DataFrame(df.pop('score').values.tolist())
    df1.columns = [f'score{i}' for i in range(1, len(df1.columns) + 1)]
    df = df1.join(df)
    print (df)
       score1  score2     pvpdate
    0      29      24  2018-05-23
    1      23      24  2018-05-29
    2      36      25  2018-05-23
    

    【讨论】:

    • df.pop('score').tolist() 也不行吗? IE。除非为了性能(边际?)没有必要下降到 NumPy。
    • @jpp - 我认为是的,当然。如果df很大,我会添加.values以获得更好的性能。
    • 我已经试过你的方法了,但是还是不行,还是和以前一样。我试过df[['score']] = df[['score',]]。 astype(str) 在应用你的方式之前,仍然不起作用。
    • 我找到了答案 import ast df['score']=df['score'].map(lambda d:ast.literal_eval(d)) dfNew=df.join(pd.DataFrame( df['score'].to_dict()).T)
    • 但是还是非常感谢你,虽然我还是不明白为什么你的不起作用
    【解决方案2】:

    Dictionary column in pandas dataframe 我找到了答案,通过使用 import ast df['score']=df['score'].map(lambda d:ast.literal_eval(d)) dfNew=df.join(pd.DataFrame(df['score'].to_dict()).T)

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 2019-03-07
      • 2019-03-25
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      相关资源
      最近更新 更多