xhang:
私のようなCSVファイルからデータを読んでいます:
import pandas as pd
data_1=pd.read_csv("sample.csv")
data_1.head(10)
これは、2つの列があります。
ID detail
1 [{'a': 1, 'b': 1.85, 'c': 'aaaa', 'd': 6}, {'a': 2, 'b': 3.89, 'c': 'bbbb', 'd': 10}]
詳細列はJSONではありませんが、それは辞書だと私は辞書を平らにしたいと、このような結果に何かをしたいです:
ID a b c d
1 1 1.85 aaaa 6
1 2 3.89 bbbb 10
私はいつも、詳細欄に、B、C、Dを取得し、SQLテーブルに最終結果を移動したいです。
缶誰かがそれを解決する方法として私を助けてください。
エズレル:
辞書理解を使用しast.literal
dictsのリストに変換、文字列のreprのために、それがために変換しDataFrame
、その後、使用concat
の最初のレベルとの変換MultiIndex
にID
列を:
import ast
d = {i: pd.DataFrame(ast.literal_eval(d)) for i, d in df[['ID','detail']].to_numpy()}
#for oldier pandas version use .values
#d = {i: pd.DataFrame(ast.literal_eval(d)) for i, d in df[['ID','detail']].values)}
df = pd.concat(d).reset_index(level=1, drop=True).rename_axis('ID').reset_index()
print (df)
ID a b c d
0 1 1 1.85 aaaa 6
1 1 2 3.89 bbbb 10
またはでlsit理解を使用DataFrame.assign
するためにID
、列の列、唯一必要な変更のために-最初に最後の列:
import ast
L = [pd.DataFrame(ast.literal_eval(d)).assign(ID=i) for i, d in df[['ID','detail']].to_numpy()]
#for oldier pandas versions use .values
#L = [pd.DataFrame(ast.literal_eval(d)).assign(ID=i) for i, d in df[['ID','detail']].values]
df = pd.concat(L, ignore_index=True)
df = df[df.columns[-1:].tolist() + df.columns[:-1].tolist()]
print (df)
ID a b c d
0 1 1 1.85 aaaa 6
1 1 2 3.89 bbbb 10
EDIT:
2のIDは、第二の溶液を変更します。
d = [pd.DataFrame(ast.literal_eval(d)).assign(ID1=i1, ID2=i2) for i1, i2, d in df[['ID1','ID2','detail']].to_numpy()]
df = pd.concat(d)
df = df[df.columns[-2:].tolist() + df.columns[:-2].tolist()]