我正在尝试重新安排我使用Pandas从json自动读取的DataFrame。我已经搜索过,但没有成功。
我有以下json(保存为字符串以便于复制/粘贴),在标签'值'
下有一堆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
我尝试过pivot和pivot_table Pandas功能,甚至尝试使用' set_index'手动转动表格。并且'堆叠'但它并不是我想要的。
>>> 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并将它们重新合并到我想要的位置?
答案 0 :(得分:9)
您的第一次尝试几乎是正确的,只需使用0
而不是将其包含在索引中。
columns='value_id'
这不是您的示例数据中的问题,但请注意,如果多个值转移到同一位置,# Perform the pivot.
df = df.pivot_table(
values='value',
index=['stream_name', 'preferred_timestamp', 'internal_timestamp'],
columns='value_id'
)
# Formatting.
df.reset_index(inplace=True)
df.columns.name = None
将汇总值(默认采用均值)。