Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用无组织词典拆分列表_Python_Pandas - Fatal编程技术网

Python 使用无组织词典拆分列表

Python 使用无组织词典拆分列表,python,pandas,Python,Pandas,我有一个这样的数据帧 id Merchant ID Date App Details 601179aa 1 27/01/21 20:03 [{:appName "FAU-G", :packageName "com.ncoregames.faug"} {:appName "Truecaller", :packageName "com.t

我有一个这样的数据帧

id            Merchant ID  Date                 App Details
601179aa      1           27/01/21 20:03  
[{:appName "FAU-G", :packageName "com.ncoregames.faug"} 
 {:appName "Truecaller", :packageName "com.truecaller"}]
id           Merchant ID  Date                 App Name  Package Name
601179aa          1          27/01/21 20:03        FAU-G com.ncoreagames.faug
601179aa          1          27/01/21 20:03.   True Caller com.truecaller

我想要这样的输出

id            Merchant ID  Date                 App Details
601179aa      1           27/01/21 20:03  
[{:appName "FAU-G", :packageName "com.ncoregames.faug"} 
 {:appName "Truecaller", :packageName "com.truecaller"}]
id           Merchant ID  Date                 App Name  Package Name
601179aa          1          27/01/21 20:03        FAU-G com.ncoreagames.faug
601179aa          1          27/01/21 20:03.   True Caller com.truecaller

我试过了

df['App Details'] = df['App Details'].str.replace(r"\[","")
df['App Details'] = df['App Details'].str.replace(r"\]","")
foo = lambda x: pd.Series([i for i in (x.split(' '))])
app_df = df['App Details'].apply(foo)

列表中的词典数量不断变化。

您可以使用正则表达式:

df=pd.DataFrame({'id': {0: '601179aa'},
 'Merchant': {0: 1},
 'ID': {0: '27/01/21'},
 'Date': {0: '20:03'},
 'App Details': {0: '[{:appName"FAU-G".:packageName"com.ncoreagames.faug"}{:appName"Truecaller",:packageName"com.truecaller"}]'}})

import re

df['App Details']=df['App Details'].str.split("}{")

    
df=df.explode('App Details')

df['App Name']=df['App Details'].apply(lambda x:re.findall('appName"(.+?)"',x)).explode()
df['Package Name']=df['App Details'].apply(lambda x:re.findall('packageName"(.+?)"',x)).explode()


     App Name          Package Name
0       FAU-G  com.ncoreagames.faug
0  Truecaller        com.truecaller

可以使用正则表达式执行此操作:

df=pd.DataFrame({'id': {0: '601179aa'},
 'Merchant': {0: 1},
 'ID': {0: '27/01/21'},
 'Date': {0: '20:03'},
 'App Details': {0: '[{:appName"FAU-G".:packageName"com.ncoreagames.faug"}{:appName"Truecaller",:packageName"com.truecaller"}]'}})

import re

df['App Details']=df['App Details'].str.split("}{")

    
df=df.explode('App Details')

df['App Name']=df['App Details'].apply(lambda x:re.findall('appName"(.+?)"',x)).explode()
df['Package Name']=df['App Details'].apply(lambda x:re.findall('packageName"(.+?)"',x)).explode()


     App Name          Package Name
0       FAU-G  com.ncoreagames.faug
0  Truecaller        com.truecaller
你可以从以下几点开始:

  • 将单元格展开为多行:
  • 要获取此信息(请注意列名的更改):

  • 将新行字符串拆分为多列: 在这里,代码还获取列的名称并对它们进行适当的重命名(假设所有行都以:appName或:packageName开头-以其他方式调整
    findall
    步骤中的正则表达式)
  • 使用新的列名将所有内容放在一起:
  • 你可以从以下几点开始:

  • 将单元格展开为多行:
  • 要获取此信息(请注意列名的更改):

  • 将新行字符串拆分为多列: 在这里,代码还获取列的名称并对它们进行适当的重命名(假设所有行都以:appName或:packageName开头-以其他方式调整
    findall
    步骤中的正则表达式)
  • 使用新的列名将所有内容放在一起:

  • 您的字符串看起来非常类似于json。一种方法可能是将字符串转换为有效的json并读取为dict。然后
    分解
    ,并使用
    json\u normalize
    提取信息,最后将索引设置为正确的值

    与公认的答案相比,这种方法的一个好处是它更具普遍性。如果您的结构不容易转换为json,这种方法可能会失败

    在本例中,我假设键都是单词,记录之间没有
    ,但可能有几个空格(实际上是非字母字符)

    df3输出:

             id  Merchant ID            Date     appName           packageName
    0  601179aa            1  27/01/21 20:03       FAU-G  com.ncoreagames.faug
    1  601179aa            1  27/01/21 20:03  Truecaller        com.truecaller
    

    您的字符串看起来非常类似于json。一种方法可能是将字符串转换为有效的json并读取为dict。然后
    分解
    ,并使用
    json\u normalize
    提取信息,最后将索引设置为正确的值

    与公认的答案相比,这种方法的一个好处是它更具普遍性。如果您的结构不容易转换为json,这种方法可能会失败

    在本例中,我假设键都是单词,记录之间没有
    ,但可能有几个空格(实际上是非字母字符)

    df3输出:

             id  Merchant ID            Date     appName           packageName
    0  601179aa            1  27/01/21 20:03       FAU-G  com.ncoreagames.faug
    1  601179aa            1  27/01/21 20:03  Truecaller        com.truecaller
    


    请以文本形式发布您的数据。关于如何提出与熊猫相关的好问题,请参见本帖:谢谢@Haleemuli。我已编辑问题“应用程序详细信息是否为字符串?”应用程序详细信息是否为字符串。您确定该字符串正确吗?没有一致性。“FAU-G.缺失”我想请以文本形式发布您的数据。关于如何提出与熊猫相关的好问题,请参见本帖:谢谢@Haleemuli。我已编辑问题“应用程序详细信息是否为字符串?”应用程序详细信息是否为字符串。您确定该字符串正确吗?没有一致性。“FAU-G.丢失”我想这对我不起作用我在应用程序名和程序包名中得到了NaN然后,您的输入有问题,我复制并粘贴it@abhishekgupta试着在创建数据框时运行整个代码,并告诉我它是否有效——实际上是我忘记给空格的空格。我已经编辑了输入。这对我不起作用。我在应用程序名和软件包名中得到了NaN。然后,您的输入有问题,我复制并粘贴it@abhishekgupta试着在创建数据框时运行整个代码,并告诉我它是否有效——实际上是我忘记给空格的空格。我已经编辑了输入
    import json
    import pandas as pd
    
    df = pd.DataFrame({
            'id': ['601179aa'],
            'Merchant ID': [1],
            'Date': ['27/01/21 20:03'],
            'App Details': [
                '[{:appName "FAU-G", :packageName "com.ncoreagames.faug"}{:appName "Truecaller", :packageName "com.truecaller"}]'
                ]
    })
    
    idx_cols = ['id', 'Merchant ID', 'Date']
    
    df2 = df.set_index(idx_cols)['App Details'] \
      .str.replace(':(\w+)', '"\\1":') \
      .str.replace('}\W*{', '},{') \
      .apply(json.loads).explode()
    
    df3 = pd.json_normalize(df2).set_index(df2.index).reset_index()
    
             id  Merchant ID            Date     appName           packageName
    0  601179aa            1  27/01/21 20:03       FAU-G  com.ncoreagames.faug
    1  601179aa            1  27/01/21 20:03  Truecaller        com.truecaller