python - Python Dataframe 对象根据条件转换为 JSON
问题描述
以前我遵循这个问题的解决方案,但后来我意识到这与我的情况不一样,我想显示一些相同的值,as_of_dates
并且ID
在display_rows
JSON 文件的部分中,我有一个这样的数据框:
as_of_date create_date ID value_1 count value_3
0 02/03/2021 02/03/2021 12345 5 2 55
1 02/03/2021 01/03/2021 12345 8 2 55
2 02/03/2021 01/03/2021 34567 9 1 66
3 02/03/2021 02/03/2021 78945 9 1 77
4 03/03/2021 02/03/2021 78945 9 1 22
5 03/03/2021 02/03/2021 12345 5 1 33
其中count
column 是相同ID
&的行数as_of_date
,例如,对于as_of_date=02/03/2021
and ID=12345
,有两行(每行不同create_date
但我不关心create_date
),所以count
前两行是相同的:2。
预期的 JSON 是:
{
"examples": [
{
"Id": 12345,
"as_of_date": "2021-03-02 00:00:00", # this field is datetime format
"value_3": 55,
"count": 2, # for the same 'ID=12345'&'as_of_date=02/03/2021'
"display_rows": [
{
"value_1": 5,
"type": "int" # 'type' field will always be 'int'
},
{
"value_1": 8,
"type": "int"
}
]
},
{
"Id": 34567,
"as_of_date": "2021-03-02 00:00:00",
"value_3": 66,
"count": 1,
"display_rows": [
{
"value_1": 9,
"type": "int"
}
]
},
{
"Id": 78945,
"as_of_date": "2021-03-02 00:00:00",
"value_3": 77,
"count": 1,
"display_rows": [
{
"value_1": 9,
"type": "int"
}
]
},
{
"Id": 78945,
"as_of_date": "2021-03-03 00:00:00",
"value_3": 22,
"count": 1,
"display_rows": [
{
"value_1": 9,
"type": "int"
}
]
},
{
"Id": 12345,
"as_of_date": "2021-03-03 00:00:00",
"value_3": 33,
"count": 1,
"display_rows": [
{
"value_1": 5,
"type": "int"
}
]
}
]
}
我花了将近一整天的时间才弄清楚,但似乎没有用......有人可以帮忙吗?谢谢。
解决方案
与 lambda 函数一起用于GroupBy.apply
处理value_1
列,例如:
import json
df['as_of_date'] = pd.to_datetime(df['as_of_date'], dayfirst=True, errors='coerce')
f = lambda x: [ {"value_1": y, "type": "int" } for y in x]
df = (df.groupby(['as_of_date','ID','value_3','count'])['value_1']
.apply(f)
.reset_index(name='display_rows'))
print (df)
as_of_date ID value_3 count \
0 2021-03-02 12345 55 2
1 2021-03-02 34567 66 1
2 2021-03-02 78945 77 1
3 2021-03-03 12345 33 1
4 2021-03-03 78945 22 1
display_rows
0 [{'value_1': 5, 'type': 'int'}, {'value_1': 8,...
1 [{'value_1': 9, 'type': 'int'}]
2 [{'value_1': 9, 'type': 'int'}]
3 [{'value_1': 5, 'type': 'int'}]
4 [{'value_1': 9, 'type': 'int'}]
j = json.dumps({"examples":df.to_dict(orient='records')}, default=str)
print (j)
{"examples": [{"as_of_date": "2021-03-02 00:00:00", "ID": 12345, "value_3": 55, "count": 2, "display_rows": [{"value_1": 5, "type": "int"}, {"value_1": 8, "type": "int"}]}, {"as_of_date": "2021-03-02 00:00:00", "ID": 34567, "value_3": 66, "count": 1, "display_rows": [{"value_1": 9, "type": "int"}]}, {"as_of_date": "2021-03-02 00:00:00", "ID": 78945, "value_3": 77, "count": 1, "display_rows": [{"value_1": 9, "type": "int"}]}, {"as_of_date": "2021-03-03 00:00:00", "ID": 12345, "value_3": 33, "count": 1, "display_rows": [{"value_1": 5, "type": "int"}]}, {"as_of_date": "2021-03-03 00:00:00", "ID": 78945, "value_3": 22, "count": 1, "display_rows": [{"value_1": 9, "type": "int"}]}]}
编辑:
#added some another column
df['value_7'] = 52
print (df)
as_of_date create_date ID value_1 count value_3 value_7
0 02/03/2021 02/03/2021 12345 5 2 55 52
1 02/03/2021 01/03/2021 12345 8 2 55 52
2 02/03/2021 01/03/2021 34567 9 1 66 52
3 02/03/2021 02/03/2021 78945 9 1 77 52
4 03/03/2021 02/03/2021 78945 9 1 22 52
5 03/03/2021 02/03/2021 12345 5 1 33 52
#added type column for last value in dict
df = (df.assign(type='int')
.groupby(['as_of_date','ID','value_3','count'])[['value_1', 'value_7','type']]
.apply(lambda x: x.to_dict('records'))
.reset_index(name='display_rows'))
print (df)
as_of_date ID value_3 count \
0 02/03/2021 12345 55 2
1 02/03/2021 34567 66 1
2 02/03/2021 78945 77 1
3 03/03/2021 12345 33 1
4 03/03/2021 78945 22 1
display_rows
0 [{'value_1': 5, 'value_7': 52, 'type': 'int'},...
1 [{'value_1': 9, 'value_7': 52, 'type': 'int'}]
2 [{'value_1': 9, 'value_7': 52, 'type': 'int'}]
3 [{'value_1': 5, 'value_7': 52, 'type': 'int'}]
4 [{'value_1': 9, 'value_7': 52, 'type': 'int'}]
j = json.dumps({"examples":df.to_dict(orient='records')}, default=str)
编辑:
df = (df.assign(example_placeholder='xyz')
.groupby(['as_of_date','ID','value_3','count'])[['value_1', 'value_7','example_placeholder']]
.apply(lambda x: x.to_dict('records'))
.reset_index(name='display_rows'))
print (df)
as_of_date ID value_3 count \
0 02/03/2021 12345 55 2
1 02/03/2021 34567 66 1
2 02/03/2021 78945 77 1
3 03/03/2021 12345 33 1
4 03/03/2021 78945 22 1
display_rows
0 [{'value_1': 5, 'value_7': 52, 'example_placeh...
1 [{'value_1': 9, 'value_7': 52, 'example_placeh...
2 [{'value_1': 9, 'value_7': 52, 'example_placeh...
3 [{'value_1': 5, 'value_7': 52, 'example_placeh...
4 [{'value_1': 9, 'value_7': 52, 'example_placeh...
df = (df.assign(aa='xyz', type='int')
.groupby(['as_of_date','ID','value_3','count'])[['value_1', 'value_7','aa', 'type']]
.apply(lambda x: x.to_dict('records'))
.reset_index(name='display_rows'))
print (df)
as_of_date ID value_3 count \
0 02/03/2021 12345 55 2
1 02/03/2021 34567 66 1
2 02/03/2021 78945 77 1
3 03/03/2021 12345 33 1
4 03/03/2021 78945 22 1
display_rows
0 [{'value_1': 5, 'value_7': 52, 'aa': 'xyz', 't...
1 [{'value_1': 9, 'value_7': 52, 'aa': 'xyz', 't...
2 [{'value_1': 9, 'value_7': 52, 'aa': 'xyz', 't...
3 [{'value_1': 5, 'value_7': 52, 'aa': 'xyz', 't...
4 [{'value_1': 9, 'value_7': 52, 'aa': 'xyz', 't...
推荐阅读
- laravel - 我应该将 CloudFront 一起用作 s3 中敏感文件的 TemporaryUrl
- javascript - 可变乘数
- java - 创建 rest api 以每秒处理特定请求
- rnn - 我可以使用 RNN 来测量两个可变长度序列之间的相似性吗?
- python - 将 pandas df 排序为单独的列
- powershell - sendkey代码会中断屏幕保护程序而不触发vi中的help.txt?
- angular - 从局部变量angular 6中的订阅函数获取数据
- mongodb - MongoDB存储比实际日期早一天
- c# - 如果 Log4net 由 Windows 服务启动,则不会记录日志
- mysql - 在 mysql 上触发 3 个表