【问题标题】:How to convert dictionary to dataframe and explode如何将字典转换为数据框并爆炸
【发布时间】:2020-11-20 05:03:21
【问题描述】:

我有字典列表

  • 我需要转换成数据框

  • 需要对所有列应用explode

  • 一些元素是一个字符串

  • 某些元素是用逗号分隔的字符串,必须拆分和分解

[
    {"var1": "EEA", "var2": "%K12%"},
    {"var1": "OVERALL"},
    {"var1": "ETLA"},
    {"var1": "A,B,C,D,E"},
    {"var1": "M,Q"},
    {"var1": "G,H"},
    {"var1": "I,J"},
    {"var1": "K,L,M"},
    {"var3": "R,T", "var2": "F"},
    {"var3": "EDUCATION", "var4": "TM"},
    {"var3": "A,B", "var4": "TM", "var5": "CCE,CCT,PP"},
    {"var1": "PHLT,PPSK,PLES,LPES", "var4": "HI"},
    {"var3": "EDUCATION", "var4": "HI", "var5": "CCM"},
    {"var3": "EDUCATION", "var4": "HI", "var5": "PP"},
    {"var4": "HI", "var5": "CCM"},
    {"var4": "HI", "var5": "PP"},
    {"var3": "A,B", "var6": "C"},
    {"var3": "", "var1": "", "var4": "", "var2": "", "var5": "", "var6": ""},
]

【问题讨论】:

  • 请分享您的预期输出。
  • 另外,你想爆炸什么?我看不到任何列表?
  • @MehulGupta,整个事情都在一个列表中。您是在问这些值是否会导致列表爆炸?
  • @MehulGupta 一旦你转换为数据框,两列中的一些值将有逗号分隔的值,我们需要分解
  • 假设列表名为d = [ {'var1:'..},{....}],您是否尝试过df = pd.DataFrame.from_dict(d)

标签: python pandas


【解决方案1】:

方法#3:

我不确定您为什么会收到内存错误。让我尝试另一种方法。我将数据集转换为普通字典,可以作为普通数据框加载到 pandas 中。看看这是否有效。

d = {}
for i in data:
    for k,v in i.items():
        if k in d:
            d[k] = list(d[k]) + v.split(',')
        else:
            d[k] = v.split(',')

m = max(len(v) for k,v in d.items())
dd = {k:v+['']*(m-len(v)) for k,v in d.items()}

import pandas as pd
df = pd.DataFrame(dd)
print (df)

方法#2:

你可以试试这个选项吗:

data = [{k:v.split(',') for k,v in i.items()} for i in data]
import pandas as pd
df = pd.DataFrame.from_dict(data)
dc = df.columns.to_list()
for col in dc:
    df = df.explode(col)
print (df)

方法#1:

您可以执行以下操作:

data = [
    {"var1": "EEA", "var2": "%K12%"},
    {"var1": "OVERALL"},
    {"var1": "ETLA"},
    {"var1": "A,B,C,D,E"},
    {"var1": "M,Q"},
    {"var1": "G,H"},
    {"var1": "I,J"},
    {"var1": "K,L,M"},
    {"var3": "R,T", "var2": "F"},
    {"var3": "EDUCATION", "var4": "TM"},
    {"var3": "A,B", "var4": "TM", "var5": "CCE,CCT,PP"},
    {"var1": "PHLT,PPSK,PLES,LPES", "var4": "HI"},
    {"var3": "EDUCATION", "var4": "HI", "var5": "CCM"},
    {"var3": "EDUCATION", "var4": "HI", "var5": "PP"},
    {"var4": "HI", "var5": "CCM"},
    {"var4": "HI", "var5": "PP"},
    {"var3": "A,B", "var6": "C"},
    {"var3": "", "var1": "", "var4": "", "var2": "", "var5": "", "var6": ""},
]

import pandas as pd
df = pd.DataFrame.from_dict(data)
dc = df.columns.to_list()
for col in dc:
    df[col] = df[col].str.split(',')
    df = df.explode(col)
print (df)

这个输出将是:

       var1   var2       var3 var4 var5 var6
0       EEA  %K12%        NaN  NaN  NaN  NaN
1   OVERALL    NaN        NaN  NaN  NaN  NaN
2      ETLA    NaN        NaN  NaN  NaN  NaN
3         A    NaN        NaN  NaN  NaN  NaN
3         B    NaN        NaN  NaN  NaN  NaN
3         C    NaN        NaN  NaN  NaN  NaN
3         D    NaN        NaN  NaN  NaN  NaN
3         E    NaN        NaN  NaN  NaN  NaN
4         M    NaN        NaN  NaN  NaN  NaN
4         Q    NaN        NaN  NaN  NaN  NaN
5         G    NaN        NaN  NaN  NaN  NaN
5         H    NaN        NaN  NaN  NaN  NaN
6         I    NaN        NaN  NaN  NaN  NaN
6         J    NaN        NaN  NaN  NaN  NaN
7         K    NaN        NaN  NaN  NaN  NaN
7         L    NaN        NaN  NaN  NaN  NaN
7         M    NaN        NaN  NaN  NaN  NaN
8       NaN      F          R  NaN  NaN  NaN
8       NaN      F          T  NaN  NaN  NaN
9       NaN    NaN  EDUCATION   TM  NaN  NaN
10      NaN    NaN          A   TM  CCE  NaN
10      NaN    NaN          A   TM  CCT  NaN
10      NaN    NaN          A   TM   PP  NaN
10      NaN    NaN          B   TM  CCE  NaN
10      NaN    NaN          B   TM  CCT  NaN
10      NaN    NaN          B   TM   PP  NaN
11     PHLT    NaN        NaN   HI  NaN  NaN
11     PPSK    NaN        NaN   HI  NaN  NaN
11     PLES    NaN        NaN   HI  NaN  NaN
11     LPES    NaN        NaN   HI  NaN  NaN
12      NaN    NaN  EDUCATION   HI  CCM  NaN
13      NaN    NaN  EDUCATION   HI   PP  NaN
14      NaN    NaN        NaN   HI  CCM  NaN
15      NaN    NaN        NaN   HI   PP  NaN
16      NaN    NaN          A  NaN  NaN    C
16      NaN    NaN          B  NaN  NaN    C
17                                          

【讨论】:

  • 得到内存错误:
  • 刚刚我跑了
  • 试试我刚刚发布的新方法。
  • 你能帮我写df.assign,stackoverflow.com/questions/48177914/…df.assign(var1=df['var1'].str.split(',')).explode('var1')这是一个专栏,如何申请专栏
  • 完美地工作 dd = {k:v+['']*(m-len(v)) for k,v in d.items()}
【解决方案2】:
df=[
{"var1": "EEA", "var2": "%K12%"},
{"var1": "OVERALL"},
{"var1": "ETLA"},
{"var1": "A,B,C,D,E"},
{"var1": "M,Q"},
{"var1": "G,H"},
{"var1": "I,J"},
{"var1": "K,L,M"},
{"var3": "R,T", "var2": "F"},
{"var3": "EDUCATION", "var4": "TM"},
{"var3": "A,B", "var4": "TM", "var5": "CCE,CCT,PP"},
{"var1": "PHLT,PPSK,PLES,LPES", "var4": "HI"},
{"var3": "EDUCATION", "var4": "HI", "var5": "CCM"},
{"var3": "EDUCATION", "var4": "HI", "var5": "PP"},
{"var4": "HI", "var5": "CCM"},
{"var4": "HI", "var5": "PP"},
{"var3": "A,B", "var6": "C"},
{"var3": "", "var1": "", "var4": "", "var2": "", "var5": "", "var6": ""},
]
df=pd.DataFrame(df)
df=df.applymap(lambda value:value.split(',') if str(value)!='nan' else [])
for col in df.columns:
   df=df.explode(col)

这个代码块爆炸每一列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2020-04-21
    相关资源
    最近更新 更多