Python 如何在熊猫中添加列表?
我正在读取一个数据帧,并尝试在另一个列表中插入一个列表,然后将其转换为json文件。我正在使用Python3和pandas的0.25.3版本 ============================ 我正在阅读的数据: ============================ 这是我的密码: ============================= 预期: ============================ 我得到的是: ====================== 我尝试使用iterrows函数做同样的事情,并在这里发布了一个问题“Dataframe和使用Pandas转换为JSON”,但有些人建议我尝试使用另一个函数的另一种方法。我知道在我的数据中添加数字对象是一件愚蠢的事情,但我已经尝试了其他方法Python 如何在熊猫中添加列表?,python,json,pandas,dataframe,apply,Python,Json,Pandas,Dataframe,Apply,我正在读取一个数据帧,并尝试在另一个列表中插入一个列表,然后将其转换为json文件。我正在使用Python3和pandas的0.25.3版本 ============================ 我正在阅读的数据: ============================ 这是我的密码: ============================= 预期: ============================ 我得到的是: ====================== 我尝试使用iterr
您能帮助我吗?定义以下重新格式化功能:
def reformat(row):
d1 = { 'part': str(row.part_number), 'client': str(row.number_client)}
d2 = { 'id': row.id_customer, 'label': row.label_customer, 'number': [d1] }
return { 'id': row.id, 'label': row.label, 'Customer': [d2] }
然后按以下方式应用它:
df.apply(reformat, axis=1).to_json('result.json', orient='records')
为可读性而重新格式化的结果是:
[ { "id":6,
"label":"Sao Paulo",
"Customer":[
{ "id":"CUST-99992",
"label":"Brazil",
"number":[{"part":"7897","client":"982"}]
}
]
},
{ "id":92,
"label":"Hong Kong",
"Customer":[
{ "id":"CUST-88888",
"label":"China",
"number":[{"part":"147","client":"288"}]
}
]
}
]
编辑下面的评论
处理单个标签的多行变体的步骤/
为客户贴上标签,采取另一种方法:
从定义以下函数开始:
获取数字属性的内容:
def getNum(grp):
return eval(grp[['part', 'client']].to_json(orient='records'))
def getCust(grp):
r0 = grp.iloc[0]
return { 'id': r0.id_customer, 'label': r0.label_customer, 'number': getNum(grp) }
注意此函数中的eval。否则,结果将是一个字符串
而不是字典列表
获取客户属性的内容:
def getNum(grp):
return eval(grp[['part', 'client']].to_json(orient='records'))
def getCust(grp):
r0 = grp.iloc[0]
return { 'id': r0.id_customer, 'label': r0.label_customer, 'number': getNum(grp) }
获取当前组的整个JSON元素的内容:
def getGrp(grp):
r0 = grp.iloc[0]
return { 'id': r0.id, 'label': r0.label, 'Customer': getCust(grp) }
然后将列类型转换为字符串:
要获得最终结果,请运行:
df.rename(columns={'part_number': 'part', 'number_client': 'client'})\
.groupby(['id', 'label', 'id_customer', 'label_customer'])\
.apply(getGrp).to_json(orient='values')
上述代码:
将零件号和零件号客户机重命名为零件和客户机,
分别地需要进行此更改以生成适当的元素
按getNum命名。
将数据帧分组为代码中的数据帧。
将getGrp函数应用于每个组。结果是一系列的
JSON元素。
最后,to_json将此系列转换为json元素列表。
定义以下重新格式化函数:
def reformat(row):
d1 = { 'part': str(row.part_number), 'client': str(row.number_client)}
d2 = { 'id': row.id_customer, 'label': row.label_customer, 'number': [d1] }
return { 'id': row.id, 'label': row.label, 'Customer': [d2] }
然后按以下方式应用它:
df.apply(reformat, axis=1).to_json('result.json', orient='records')
为可读性而重新格式化的结果是:
[ { "id":6,
"label":"Sao Paulo",
"Customer":[
{ "id":"CUST-99992",
"label":"Brazil",
"number":[{"part":"7897","client":"982"}]
}
]
},
{ "id":92,
"label":"Hong Kong",
"Customer":[
{ "id":"CUST-88888",
"label":"China",
"number":[{"part":"147","client":"288"}]
}
]
}
]
编辑下面的评论
处理单个标签的多行变体的步骤/
为客户贴上标签,采取另一种方法:
从定义以下函数开始:
获取数字属性的内容:
def getNum(grp):
return eval(grp[['part', 'client']].to_json(orient='records'))
def getCust(grp):
r0 = grp.iloc[0]
return { 'id': r0.id_customer, 'label': r0.label_customer, 'number': getNum(grp) }
注意此函数中的eval。否则,结果将是一个字符串
而不是字典列表
获取客户属性的内容:
def getNum(grp):
return eval(grp[['part', 'client']].to_json(orient='records'))
def getCust(grp):
r0 = grp.iloc[0]
return { 'id': r0.id_customer, 'label': r0.label_customer, 'number': getNum(grp) }
获取当前组的整个JSON元素的内容:
def getGrp(grp):
r0 = grp.iloc[0]
return { 'id': r0.id, 'label': r0.label, 'Customer': getCust(grp) }
然后将列类型转换为字符串:
要获得最终结果,请运行:
df.rename(columns={'part_number': 'part', 'number_client': 'client'})\
.groupby(['id', 'label', 'id_customer', 'label_customer'])\
.apply(getGrp).to_json(orient='values')
上述代码:
将零件号和零件号客户机重命名为零件和客户机,
分别地需要进行此更改以生成适当的元素
按getNum命名。
将数据帧分组为代码中的数据帧。
将getGrp函数应用于每个组。结果是一系列的
JSON元素。
最后,to_json将此系列转换为json元素列表。
你能给出一个输入数据框的示例吗?嗨,你能展示一下数据框数据在处理结束时的样子吗?我编辑了我的问题@ScottBoston!!TK你能给出一个输入数据框的示例吗?嗨,你能展示一下数据框数据在处理结束时的样子吗?我编辑了我的问题@ScottBoston!!谢谢你的评论@Valdi_Bo,但没有解决我的问题。我现在编辑了我的问题。。希望这有帮助。。例如:如果第0行中我的单元格中的所有内容在第2行中都相同,但在part_number和number_client中除外,则不会创建id、label、id_customer和label_customer的新对象。。只会添加一个新的号码列表,如我的问题描述中所示。我更改了解决方案,以应对单个标签/标签客户多行的情况。感谢您的评论@Valdi_-Bo,但没有解决我的问题。我现在编辑了我的问题。。希望这有帮助。。例如:如果第0行中我的单元格中的所有内容在第2行中都相同,但在part_number和number_client中除外,则不会创建id、label、id_customer和label_customer的新对象。。只会添加一个新的号码列表,如我的问题描述中所示。我更改了解决方案,以应对单个标签/标签客户多行的情况。