【发布时间】:2016-07-01 09:28:47
【问题描述】:
我正在尝试重新排列我使用 Pandas 从 json 中自动读取的 DataFrame。我已经搜索过,但没有成功。
我有以下 json(保存为字符串以方便复制/粘贴)在标签“value”下带有一堆 json 对象/字典
json_str = '''{"preferred_timestamp": "internal_timestamp",
"internal_timestamp": 3606765503.684,
"stream_name": "ctdpf_j_cspp_instrument",
"values": [{
"value_id": "temperature",
"value": 9.8319
}, {
"value_id": "conductivity",
"value": 3.58847
}, {
"value_id": "pressure",
"value": 22.963
}]
}'''
我使用函数 'json_normalize' 将 json 加载到扁平化的 Pandas 数据帧中。
>>> from pandas.io.json import json_normalize
>>> import simplejson as json
>>> df = json_normalize(json.loads(json_str), 'values', ['preferred_timestamp', 'stream_name', 'internal_timestamp'])
>>> df
value value_id preferred_timestamp internal_timestamp \
0 9.83190 temperature internal_timestamp 3.606766e+09
1 3.58847 conductivity internal_timestamp 3.606766e+09
2 22.96300 pressure internal_timestamp 3.606766e+09
3 32.89470 salinity internal_timestamp 3.606766e+09
stream_name
0 ctdpf_j_cspp_instrument
1 ctdpf_j_cspp_instrument
2 ctdpf_j_cspp_instrument
3 ctdpf_j_cspp_instrument
这是我卡住的地方。我想获取 value 和 value_id 列并将它们转换为基于 value_id 的新列。
我希望数据框如下所示:
stream_name preferred_timestamp internal_timestamp conductivity pressure salinity temperature
ctdpf_j_cspp_instrument internal_timestamp 3.606766e+09 3.58847 22.96300 32.89470 9.83190
我已经尝试过 pandas 的 pivot 和 pivot_table 函数,甚至尝试使用“set_index”和“stack”手动旋转表格,但这并不是我想要的。
>>> df.pivot_table(values='value', index=['stream_name', 'preferred_timestamp', 'internal_timestamp', 'value_id'])
stream_name preferred_timestamp internal_timestamp value_id
ctdpf_j_cspp_instrument internal_timestamp 3.606766e+09 conductivity 3.58847
pressure 22.96300
salinity 32.89470
temperature 9.83190
Name: value, dtype: float64
这很接近,但它似乎没有将“value_id”中的值转换为单独的列。
和
>>> df.pivot('stream_name', 'value_id', 'value')
value_id conductivity pressure salinity temperature
stream_name
ctdpf_j_cspp_instrument 3.58847 22.963 32.8947 9.8319
再次关闭,但缺少我想与此行关联的其他列。
我被困在这里了。有没有一种优雅的方法可以做到这一点,或者我应该拆分 DataFrame 并将它们重新合并到我想要的方式?
【问题讨论】:
标签: python pandas pivot-table