Python Pandas:只保留DataFrame中的某些列,同时保留其他列

时间:2016-03-15 18:55:53

标签: python pandas pivot-table

我正在尝试重新安排我使用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并将它们重新合并到我想要的位置?

1 个答案:

答案 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 将汇总值(默认采用均值)。