我的数据如下:
d = [{'id':1, 'a':10, 'b':10}, {"id":2,"a":20, "b":20}]
我想要的结果如下:
res = [{'id': 1, 'prop': 'a', 'value': 10},
{'id': 1, 'prop': 'b', 'value': 10},
{'id': 2, 'prop': 'a', 'value': 20},
{'id': 2, 'prop': 'b', 'value': 20}]
由于每一行都有两个属性,所以我想将具有相同id但不同属性以及该属性对应值的每一行拆分
我使用的是
import pandas as pd
df = pd.DataFrame(d)
l = []
for _, r in df.iterrows():
for p in ['a','b']:
l.append({'id':r.id, 'prop':p, 'value':r[p]})
我得到了想要的东西,但我想知道的是,是否有任何方法可以使用纯熊猫命令来实现我的目标
答案 0 :(得分:2)
通过构造函数创建DataFrame
,然后使用DataFrame.melt
和最后一个DataFrame.to_dict
并使用参数r
进行记录:
df = pd.DataFrame(d)
#melt all columns without id
df1 = df.melt('id', var_name='prop')
#if necessary specify columns
#df1 = df.melt('id', var_name='prop', value_vars=['a','b'])
res = df1.to_dict('r')
print (res)
[{'id': 1, 'prop': 'a', 'value': 10}, {'id': 2, 'prop': 'a', 'value': 20},
{'id': 1, 'prop': 'b', 'value': 10}, {'id': 2, 'prop': 'b', 'value': 20}]
print (type(res))
<class 'list'>
答案 1 :(得分:2)
使用pd.melt
,然后将to_json
与orient=records
一起使用
使用json.loads
import json
d = [{'id':1, 'a':10, 'b':10}, {"id":2,"a":20, "b":20}]
df = pd.DataFrame(d)
res = pd.melt(df,id_vars=['id'],value_vars=['a','b'],var_name='prop')
json_res= json.loads(res.to_json(orient='records'))
[{"id":1,"prop":"a","value":10},{"id":2,"prop":"a","value":20},{"id":1,"prop":"b","value":10},{"id":2,"prop":"b","value":20}]