我有一个像这样的数据框
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)
所有选项都不正确。如何解决?
答案 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)