使用熊猫将一行中的多个值拆分为多行

时间:2019-07-29 04:58:58

标签: pandas

我的数据如下:

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]})

我得到了想要的东西,但我想知道的是,是否有任何方法可以使用纯熊猫命令来实现我的目标

2 个答案:

答案 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_jsonorient=records一起使用

使用json.loads

将字符串json转换为正确的列表格式
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}]