在熊猫中处理数据框的数据

时间:2019-12-10 22:10:15

标签: python json pandas dataframe

我正在读取数据帧并将其转换为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_numbernumber_client而不是partclient。我该如何解决?

第二个问题:我可以有不同的具有相同键名的列表。例如:在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

我应该改变什么?

1 个答案:

答案 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)