【问题标题】:Pandas, how to multiindex an existing DataFrame that's data comes from JSON. How to alter JSON object through pandasPandas,如何对来自 JSON 的数据的现有 DataFrame 进行多索引。如何通过 pandas 更改 JSON 对象
【发布时间】:2017-11-16 13:05:02
【问题描述】:

我有以下包含 JSON 对象的文件:

{"v": "1","uuid": "c62f3e001c5a43d7bc663eef7db5372c","source": 3,"uniqueName": "hive","sensorId": 8324,"alarm": false,"date": 1497387606620,"movement": 49280,"rssi": 362,"lux": 16,"magnet": 16,"ageSent": 69206224,"ipAddress": "0.0.0.0","locationSensorId": 0,"locationCounter": 0,"readerId": 67,"geo": {"x": "1","y": "1","z": "1"},"sys": {},"fa": {},"requestOriginTypeId": 2,"failover": {"adv": 1,"oi": 1,"c": 1,"cr": 1},"D": "3","W": 24,"M": 5,"Y": 2017,"user": {"ui": "0","id": "0","cntry": "UK","cty": "NEWBY","gender": 0,"age": 0,"dt": 0,"scr": 0},"resp": {"rid": 67,"adv": 10000001,"oi": 1,"c": 1,"cr": 1,"p": 1.0,"b": 1.0,"curr": "£","rb": 1}}

我有一个问题,我需要在这里访问值“adv”:100000001:

"resp": {"rid": 67,"adv": 10000001,"oi": 1,"c": 1,"cr": 1,"p": 1.0,"b": 1.0,"curr": "£","rb": 1}

由于格式的原因,我的 dataFrame 包含一个带有值的列“resp”:

{"rid": 67,"adv": 10000001,"oi": 1,"c": 1,"cr": 1,"p": 1.0,"b": 1.0,"curr": "£","rb": 1}

获取该值的最佳方式是什么?我正在考虑从 {u'adv': 1, u'cr': 1, u'c': 1, u'oi': 1} 创建一个系列(“resp”下的值)

我还有另一个问题,这是我的主要问题。我有一个从上面的 json 创建的大 df,最终将只包含列

df_json = df_json[['day_time','sensor_id','customer_id','rssi','date','time']]

在此之前,一些列已重命名,这就是为什么您可能在 json 中看不到相关性的原因。

目前数据如下所示(day_time = date only [见第一行]/它是日期,但日期将接近 df 的末尾):

                   day_time  sensor_id  customer_id  rssi  advertiser_id  \
0   2017-03-17                 4000068           76   352        1000001
0   2017-03-17 09:20:17.708    4000068           56   374        1000001
1   2017-03-17 09:20:42.561    4000068           60   392        1000001
0   2017-03-17 09:44:21.728    4000514           76   352        1000001
0   2017-03-17 10:32:45.227    4000461           76   332        1000001
0   2017-03-17 12:47:06.639    4000046           43   364        1000001
0   2017-03-17 12:49:34.438    4000046           62   423        1000001
0   2017-03-17 12:52:28.430    4000072           62   430        1000001
1   2017-03-17 12:52:32.593    4000072           62   394        1000001
0   2017-03-17 12:53:17.708    4000917           76   335        1000001

我需要这个 df 被 day_stamp 和 sensor_id 多索引,这样数据(如果我错了,请纠正我!)将显示为:

          date  sensor_id  customer_id  rssi  advertiser_id  \
0   2017-03-17     4000068           76   352        1000001
0                                    56   374        1000001
1                                    60   392        1000001
0   2017-03-17     4000514           76   352        1000001
0   2017-03-17     4000461           76   332        1000001

我想要这种格式的数据的原因是我可以将 .diff() 函数应用于时间,并计算出每个 sensor_id 的每条记录之间的时间差。

我相信这也有问题。因为 time.diff() 最终会找到一个 ID 和另一个 ID 之间的时间差。是否有包含 diff() 方法来查找具有相同 sensor_id 的记录之间的时间差?

我想再次强调,我的主要问题是对现有 df 进行多索引(感觉这里有 5 个问题)。如何将 day_time 和 sensor_id 输出为可在 multiIndex 中使用的有效数组?

【问题讨论】:

    标签: python json pandas indexing multi-index


    【解决方案1】:

    我认为你需要:

    print (df)
                      day_time  sensor_id  customer_id  rssi  advertiser_id
    0               2017-03-17    4000068           76   352        1000001
    0  2017-03-17 09:20:17.708    4000068           56   374        1000001
    1  2017-03-17 09:20:42.561    4000068           60   392        1000001
    0  2017-03-17 09:44:21.728    4000514           76   352        1000001
    0  2017-03-17 10:32:45.227    4000461           76   332        1000001
    0  2017-03-17 12:47:06.639    4000046           43   364        1000001
    0  2017-03-17 12:49:34.438    4000046           62   423        1000001
    0  2017-03-17 12:52:28.430    4000072           62   430        1000001
    1  2017-03-17 12:52:32.593    4000072           62   394        1000001
    0  2017-03-17 12:53:17.708    4000917           76   335        1000001
    

    df['day_time'] = pd.to_datetime(df['day_time']).dt.date
    df = df.set_index(['day_time','sensor_id']).sort_index()
    print (df)
                          customer_id  rssi  advertiser_id
    day_time   sensor_id                                  
    2017-03-17 4000046             43   364        1000001
               4000046             62   423        1000001
               4000068             76   352        1000001
               4000068             56   374        1000001
               4000068             60   392        1000001
               4000072             62   430        1000001
               4000072             62   394        1000001
               4000461             76   332        1000001
               4000514             76   352        1000001
               4000917             76   335        1000001
    

    【讨论】:

    • 这会在 day_time 之前创建一个索引,但仍然有 sensor_ids 作为混合,例如 sensor_id 看起来仍然和我的示例数据中的一样。
    • 也许可以帮助sort_index
    • 我发现一些 pandas 文档很难理解,我会做 sort_index(axis=index, level= not too sure)
    • 可以,不过我觉得没必要,因为axis=0,level=0都是默认值,所以可以省略。
    • 完美!谢谢!我确定它需要一个多索引,我确定的一件事是我需要一些熊猫课程:D
    【解决方案2】:

    如果您只需要差异,则可以使用转换。像

    df['time_diff'] = df.groupby(('date', 'sensor_id')).transform('diff')['day_time']
    

    应该工作

    【讨论】:

    • 这实际上是我这样做的旧方法,但我对变换('diff')感兴趣。还有另一个为什么 groupby 没用的原因我现在不记得了:(
    • 我发现这个blog posttransform很有启发性
    • 当我看到它是如何工作的图片时,我非常高兴!我是否正确地说这正是我所需要的?正确索引 df 并且 transform 允许将 diff 方法应用于相同 sensor_id 的组,并且不会找到两个不同 id 之间的时间差异?
    • @DanielCull difference in time between two different ids 是什么意思 你在更大的数据集上试过了吗? Transform 传递了 DataFrame 的一个块(1 个 (date, sensor_id)- 组合的数据,并在该块上应用函数 diff。然后将原始 DataFrame 中的一个新列 time_diff 分配给列 @987654328 的这个差异@
    • 是的,我意识到,我在自嘲,我问这个问题是否会按照我认为的方式工作,当你发布的博客确实说明了这一点时。此外,我还记得我的 groupby 最初的问题,这不一定是问题!我按太多列分组,认为我需要拥有所有列,忘记了我可以将你的 ['time_diff'] 与 df 合并后
    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2021-11-13
    • 2020-09-05
    • 2020-10-18
    • 2019-12-25
    • 2020-11-26
    相关资源
    最近更新 更多