pandas 将包含列表值的字典的字典转换为数据框

xlpyo6sf  于 2023-01-19  发布在  其他
关注(0)|答案(2)|浏览(249)

我已经提供了一个非常大的字典与以下格式,我不知道如何转换成一个 Dataframe ,我可以用来执行基本功能。

{
    'hash': {
        'ids': [List of Unique IDs of records this hash has been seen in],
        'weights': [List of weights],
        'values': [List of values],
        'measure_dates': [List of dates]
    }
}

hashidsweightsvaluesmeasure_dates中的项目数是相同的。但是不同的hash可以有不同的项目数。这取决于测量的频率。
三个记录示例的真实的(ish)数据:

{
    'IRR-99876-UTY': {
        'ids': [9912234, 9912237, 45555889],
        'weights': [0.09, 0.09, 0.113],
        'values': [2.31220, 2.31219, 2.73944],
        'measure_dates': ['2021-10-14', '2021-10-15', '2022-12-17']
    },
    'IRR-10881-CKZ': {
        'ids': [45557231],
        'weights': [0.31],
        'values': [5.221001],
        'measure_dates': ['2022-12-31']
    },
    'IRR-881-CKZ': {
        'ids': [24661, 24662, 29431],
        'weights': [0.05, 0.07, 0.105],
        'values': [3.254, 4.500001, 7.3221],
        'measure_dates': ['2018-05-05', '2018-05-06', '2018-07-01']
    }
}

索引中的值对应于正在进行的相同测量。例如,在IRR-881-CKZ中,有3个测量。

  • 测量1于2018年5月5日进行,ID为24661,重量为0.05,值为3.254
  • 测量2于2018年5月6日进行,ID为24662,重量为0.07,数值为4.500001
  • 测量3于2018年7月1日进行,ID为29431,重量为0.105,数值为7.3221

没有其他索引组合对此哈希有效。
我将尝试获取数据的信息:

  • 哪些哈希值最常被测量。这可以通过ids列表中哪些项的数量最多来确定。在本例中,第一条和第三条记录有三个项,因此将是顶部结果。我希望能够使用nlargest()sort_values().head()之类的东西来获得此结果,而不是解析每条记录并计算项的数量。
  • 哪个哈希值的平均值在两个值之间,如果我有一个固定的列数,我想我可以做一些类似df['average'] = df[['value1', 'value2']].mean(axis=1)的事情,但是对于一个可变的值数,我不知道该怎么做。

我怎样才能把这个字典的字典的列表转换成一个可用的 Dataframe ?

oxcyiej7

oxcyiej71#

您可以在panda中使用.from_dict()将其转换为 Dataframe 。

import pandas as pd

# dictionary of dictionaries with list values
data = {
    'IRR-99876-UTY': {
        'ids': [9912234, 9912237, 45555889],
        'weights': [0.09, 0.09, 0.113],
        'values': [2.31220, 2.31219, 2.73944],
        'measure_dates': ['2021-10-14', '2021-10-15', '2022-12-17']
    },
    'IRR-10881-CKZ': {
        'ids': [45557231],
        'weights': [0.31],
        'values': [5.221001],
        'measure_dates': ['2022-12-31']
    },
    'IRR-881-CKZ': {
        'ids': [24661, 24662, 29431],
        'weights': [0.05, 0.07, 0.105],
        'values': [3.254, 4.500001, 7.3221],
        'measure_dates': ['2018-05-05', '2018-05-06', '2018-07-01']
    }
}

# convert to data frame
df = pd.DataFrame.from_dict(data, orient='index')
mqkwyuun

mqkwyuun2#

您需要将此字典的每个条目转换为自己的DataFrame,并将它们连接起来,以便有效地处理此数据:

创建可用的数据框

import pandas as pd

data = {
    'IRR-99876-UTY': {
        'ids': [9912234, 9912237, 45555889],
        'weights': [0.09, 0.09, 0.113],
        'values': [2.31220, 2.31219, 2.73944],
        'measure_dates': ['2021-10-14', '2021-10-15', '2022-12-17']
    },
    'IRR-10881-CKZ': {
        'ids': [45557231],
        'weights': [0.31],
        'values': [5.221001],
        'measure_dates': ['2022-12-31']
    },
    'IRR-881-CKZ': {
        'ids': [24661, 24662, 29431],
        'weights': [0.05, 0.07, 0.105],
        'values': [3.254, 4.500001, 7.3221],
        'measure_dates': ['2018-05-05', '2018-05-06', '2018-07-01']
    }
}

df = pd.concat(
    {k: pd.DataFrame(v) for k, v in data.items()}, 
    names=['hash', 'obs']
)

print(df)
                        ids  weights    values measure_dates
hash          obs                                           
IRR-99876-UTY 0     9912234    0.090  2.312200    2021-10-14
              1     9912237    0.090  2.312190    2021-10-15
              2    45555889    0.113  2.739440    2022-12-17
IRR-10881-CKZ 0    45557231    0.310  5.221001    2022-12-31
IRR-881-CKZ   0       24661    0.050  3.254000    2018-05-05
              1       24662    0.070  4.500001    2018-05-06
              2       29431    0.105  7.322100    2018-07-01

既然我们的数据已经清理完毕,我们可以解决您的问题。

解决你的问题

1.最常测量哪些哈希

1.这些散列具有两个值之间的平均值。

  • 这是一个groupby操作,我们计算每个唯一“hash”的“values”列的平均值,然后我们可以使用Series.between方法来检查两个任意值之间是否存在这些平均值。
# Which hash(es) are measured the most often.
df.index.get_level_values('hash').value_counts()

# IRR-99876-UTY    3
# IRR-881-CKZ      3
# IRR-10881-CKZ    1
# Name: hash, dtype: int64

# ---
# Which hashes have an average value between two values.
## Here you can see that I'm testing whether the average is between 0 and 4
print(df.groupby('hash')['values'].mean().between(0, 4))

# IRR-10881-CKZ    False
# IRR-881-CKZ      False
# IRR-99876-UTY     True
# Name: values, dtype: bool

相关问题