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
你可以从以下几点开始:
findall
步骤中的正则表达式)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