如何使用类型为dict的单元格将列拆分为某些列?

时间:2018-02-15 19:24:07

标签: python pandas replace split

我有一个像这样的数据框

Sub Print_sheet()

ThisWorkbook.Sheets(Array(1, 2)).Select

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Users\HP\Desktop\Test\MI team\aa.pdf", Quality:=xlQualityStandard, 
IncludeDocProperties:=True, _
 IgnorePrintAreas:=False, OpenAfterPublish:=True

End Sub

我想要

df = pd.DataFrame({'a' :[{'id':'0','num':10 } ,{'id':'1','num':20 },{'id':'2','num':30 }]})

我想只保留数字和字母然后应用 id num 0 0 10 1 1 20 2 2 30 但我不能成功

split

df['a'] = df['a'].replace('[^a-zA-Z0-9]', '', regex = True)
df

df['a'].str.strip('{').astype(str)

所有选项都不正确。如何解决?

5 个答案:

答案 0 :(得分:3)

IIUC

只需将系列转换为数据框

pd.DataFrame(df.a.tolist())

  id  num
0  0   10
1  1   20
2  2   30

如果a中的值是可以转换为字典的字符串,请使用ast

import ast
pd.DataFrame(df.a.apply(lambda x: ast.literal_eval(x)).tolist())

答案 1 :(得分:3)

使用你的df + apply

df.a.apply(pd.Series)
Out[559]: 
  id  num
0  0   10
1  1   20
2  2   30

答案 2 :(得分:2)

替代djk47463的答案(应该被接受)是

df["id"] = df["a"].apply(lambda x : x["id"])
df["num"] = df["a"].apply(lambda x : x["num"])
df.drop(columns=["a"], inplace=True)

编辑(时间)

lst = [{"id":i, 'num':(i+1)*10} for i in range(10000)]
df =  pd.DataFrame({"a":lst})

%%timeit -n10
a = df.a.apply(pd.Series)
1.98 s ± 26.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit -n100
a = pd.DataFrame(df.a.tolist())
9.01 ms ± 292 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit -n100
a = pd.DataFrame(df.a.values.tolist())
8.75 ms ± 107 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit -n100
df["id"] = df["a"].apply(lambda x : x["id"])
df["num"] = df["a"].apply(lambda x : x["num"])
5.33 ms ± 257 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

鉴于您已经有了一个列表,您可以在创建数据帧之前使用它

%%timeit -n100
a = pd.DataFrame([[l["id"], l["num"]] for l in lst], columns=["id", "num"])
3.6 ms ± 111 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

答案 3 :(得分:0)

df = pd.DataFrame({'a' :[{'id':'0','num':10 } ,{'id':'1','num':20 },{'id':'2','num':30 }]}['a'])
print df

   id  num
0  0   10
1  1   20
2  2   30

替换{'a' :[{'id':'0','num':10 } ,{'id':'1','num':20 },{'id':'2','num':30 }]}

{'a' :[{'id':'0','num':10 } ,{'id':'1','num':20 },{'id':'2','num':30 }]} ['a']

答案 4 :(得分:0)

你意识到你可以轻松做到吗?

pd.DataFrame([{'id':'0','num':10 } ,{'id':'1','num':20 },{'id':'2','num':30 }])

时间与djk47463的答案相当。所以我猜它在发动机罩下运行相同的命令,但是在检查了类型之后。

lst = [{"id":i, 'num':(i+1)*10} for i in range(int(10000))]

%%timeit -n100
a = pd.DataFrame(lst)
9.94 ms ± 196 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)