【问题标题】:Python Pandas: pivot only certain columns in the DataFrame while keeping othersPython Pandas:仅旋转 DataFrame 中的某些列,同时保留其他列
【发布时间】: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


    【解决方案1】:

    您的第一次尝试几乎是正确的,只需使用 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
    

    这在您的示例数据中不是问题,但请记住,如果将多个值旋转到同一位置(默认取平均值),pivot_table 将聚合值。

    【讨论】:

    • 谢谢!问题总是如此之小......旋转多个值的适当程序是什么?
    • 可能因情况而异,但有几个选项。如果聚合有意义,您可以指定如何聚合,包括使用您在代码中其他地方定义的自定义函数,例如agg_func='max'agg_func=custom_function。如果您想要保留特定的值,您可以进行一些预处理以删除您不想包含的值。将重复项分开的一个选项是添加一个虚拟列以使您的数据透视唯一,然后在数据透视后将其删除。
    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多