我正在读取数据帧并将其转换为json文件。我正在使用python 3和0.25.3版本的pandas。我已经从你们(Manipulating data of Pandas dataframe)那里获得了一些帮助,但是我对代码及其工作方式有一些疑问。
我的数据框:
id label id_customer label_customer part_number number_client
6 Sao Paulo CUST-99992 Brazil 7897 982
6 Sao Paulo CUST-99992 Brazil 888 12
92 Hong Kong CUST-88888 China 147 288
代码:
import pandas as pd
data = pd.read_excel(path)
data[["part_number","number_client"]] = data[["part_number","number_client"]].astype(str)
f = lambda x: x.split('_')[0]
j =(data.groupby(["id","label","id_customer","label_customer"])['part_number','number_client']
.apply(lambda x: x.rename(columns=f).to_dict('r')).reset_index(name='Number')
.groupby(["id", "label"])[ "id_customer", "label_customer", "Number"]
.apply(lambda x: x.rename(columns=f).to_dict('r')).reset_index(name='Customer')
.to_json(orient='records'))
print (j)
Json,我得到了:
[{
"id": 6,
"label": "Sao Paulo",
"Customer": [{
"id": "CUST-99992",
"label": "Brazil",
"number": [{
"part": "7897",
"client": "982"
},
{
"part": "888",
"client": "12"
}
]
}]
},
{
"id": 92,
"label": "Hong Kong",
"Customer": [{
"id": "CUST-888888",
"label": "China",
"number": [{
"part": "147",
"client": "288"
}]
}]
}
]
第一个问题:当找到lambda
时,apply
和_
函数正在拆分我的列名。这仅是我数据框的一部分和一些列,我想保留名称。例如:我想在我的json结构中获取part_number
和number_client
而不是part
和client
。我该如何解决?
第二个问题:我可以有不同的具有相同键名的列表。例如:在customer
列表中,我有part_number
键,但是在另一个具有另一个值的列表中,我也可以具有相同的键名。例如:part_number
列表内的test
。
第三个问题::在我的完整数据框中,当我有一个简单的文本时,会有一个名为Additional_information
的列。我必须得到这样的结构:
...
"Additional_information":[{
{
"text": "testing",
}
},
{
"text": "testing again",
}
]
对于这样的数据框:
id label id_customer label_customer part_number number_client Additional_information
6 Sao Paulo CUST-99992 Brazil 7897 982 testing
6 Sao Paulo CUST-99992 Brazil 7897 982 testing again
我应该改变什么?
答案 0 :(得分:1)
第一个问题:
您可以编写用于重命名的自定义函数,例如喜欢:
def f(x):
vals = ['part_number', 'number_client']
if x in vals:
return x
else:
return x.split('_')[0]
第二个问题
如果我正确理解,则最终json中的密钥是从原始Dataframe的列创建的,也是由我的解决方案的name
的参数reset_index
创建的。如果要为更改键(列名)使用其他逻辑,则可以更改第一个解决方案。
第三个问题
在原始解决方案中,将to_json
更改为to_dict
以便可能修改字典的最终列表,例如附加text
信息,因为json在最后一步中用于json.dumps
:>
import json
def f(x):
vals = ['part_number', 'number_client']
if x in vals:
return x
else:
return x.split('_')[0]
d =(data.groupby(["id","label","id_customer","label_customer"])['part_number','number_client']
.apply(lambda x: x.rename(columns=f).to_dict('r')).reset_index(name='Number')
.groupby(["id", "label"])[ "id_customer", "label_customer", "Number"]
.apply(lambda x: x.rename(columns=f).to_dict('r')).reset_index(name='Customer')
.to_dict(orient='records'))
#print (d)
d1 = (data[['Additional_information']].rename(columns={'Additional_information':'text'})
.to_dict(orient='records'))
d1 = {'Additional_information':d1}
print (d1)
{'Additional_information': [{'text': 'testing'}, {'text': 'testing again'}]}
d.append(d1)
#print (d)
j = json.dumps(d)
#print (j)