次の形式のデータフレーム列があります。
col1 col2
A [{'Id':42,'prices':['30',’78’]},{'Id': 44,'prices':['20','47',‘89’]}]
B [{'Id':47,'prices':['30',’78’]},{'Id':94,'prices':['20']},{'Id':84,'prices':['20','98']}]
どうすれば次のように変換できますか?
col1 Id price
A 42 ['30',’78’]
A 44 ['20','47',‘89’]
B 47 ['30',’78’]
B 94 ['20']
B 84 ['20','98']
解決策として適用とラムダを使用することを考えていましたが、方法がわかりません。
編集:このデータフレームを再作成するには、次のコードを使用します。
data = [['A', "[{'Id':42,'prices':['30','78']},{'Id': 44,'prices':['20','47','89']}]"],
['B', "[{'Id':47,'prices':['30','78']},{'Id':94,'prices':['20']},{'Id':84,'prices':['20','98']}]"]]
df = pd.DataFrame(data, columns = ['col1', 'col2'])
ここでは df.explode
を pd.Series.apply
と一緒に使用できます および df.set_index
および df.reset_index
df.set_index('col1').explode('col2')['col2'].apply(pd.Series).reset_index()
col1 Id prices
0 A 42 [30, 78]
1 A 44 [20, 47, 89]
2 B 47 [30, 78]
3 B 94 [20]
4 B 84 [20, 98]
col2
が文字列の場合、 ast.literal_eval
を使用します
import ast
data = [['A', "[{'Id':42,'prices':['30','78']},{'Id': 44,'prices':['20','47','89']}]"],
['B', "[{'Id':47,'prices':['30','78']},{'Id':94,'prices':['20']},{'Id':84,'prices':['20','98']}]"]]
df = pd.DataFrame(data, columns = ['col1', 'col2'])
df['col2'] = df['col2'].map(ast.literal_eval)
df.set_index('col1').explode('col2')['col2'].apply(pd.Series).reset_index()
col1 Id prices
0 A 42 [30, 78]
1 A 44 [20, 47, 89]
2 B 47 [30, 78]
3 B 94 [20]
4 B 84 [20, 98]
「データ」の2番目のパラメーターをリストと見なします。
data= [
['A', [{'Id':42,'prices':['30','78']},{'Id': 44,'prices':['20','47','89']}]],
['B', [{'Id':47,'prices':['30','78']}, {'Id':94,'prices':['20']},{'Id':84,'prices':
['20','98']}]]
]
t_list = []
for i in range(len(data)):
for j in range(len(data[i][1])):
t_list.append((data[i][0], data[i][1][j]['Id'], data[i][1][j]['prices']))
df = pd.DataFrame(t_list, columns=['col1', 'id', 'price'])
print(df)
col1 id price
0 A 42 [30, 78]
1 A 44 [20, 47, 89]
2 B 47 [30, 78]
3 B 94 [20]
4 B 84 [20, 98]