使用Pandas创建“实时”真相表

2024-10-01 07:44:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我收到API的警报字典,其中包含设备状态变化的更新,例如:

        alert1 = {'equipment': 'equipment1', 'condition1': True}
        alert2 = {'equipment': 'equipment1', 'condition2': True}
        alert3 = {'equipment': 'equipment1', 'condition3': False}
        alert4 = {'equipment': 'equipment2', 'condition1': True}
        alert5 = {'equipment': 'equipment2', 'condition2': False}
        alert6 = {'equipment': 'equipment3', 'condition2': False}
        ...

传入警报将触发函数更新“实时”真值表,预期输出如下:

equipment   condition1  condition2  condition3
equipment1    True        True         False
equipment2    True        False        NaN
equipment3    NaN         False        Nan

如果收到新警报,该表应更新

用熊猫来达到这个目的最好的方法是什么


Tags: apifalsetrue字典状态警报nanequipment
3条回答

可能有点过分了。。。您可以附加到df,然后在收到信号时重新生成真值表df2

cl = [{'condition1': {'equipment1': True}},
 {'condition2': {'equipment1': True}},
 {'condition3': {'equipment1': False}},
 {'condition1': {'equipment2': True}},
 {'condition2': {'equipment2': False}},
 {'condition2': {'equipment3': False}}]

# fully expand list / embedded dict
df = pd.json_normalize(cl, sep="-")
# bring multiple inputs together,  there's only one signal per row
df2 = df.assign(foo=1).groupby("foo").agg({c:"first" for c in df.columns}).reset_index().drop(columns="foo")
# now restructure as required
df2 = df2.T.reset_index().assign(equip=lambda dfa: dfa["index"].apply(lambda r: r.split("-")[1]),
                          cond=lambda dfa: dfa["index"].apply(lambda r: r.split("-")[0]),
                         ).drop(columns="index").set_index(["equip","cond"]).unstack(1).droplevel(0, axis=1).reset_index()

输出

cond       equip condition1 condition2 condition3
0     equipment1       True       True      False
1     equipment2       True      False        NaN
2     equipment3        NaN      False        NaN

使用相同的解决方案,首先创建空数据帧。然后使用alter_list seq by seq更新df

alter_list = [
        {'equipment': 'equipment1', 'condition1': True},
        {'equipment': 'equipment1', 'condition2': True},
        {'equipment': 'equipment1', 'condition3': False},
        {'equipment': 'equipment2', 'condition1': True},
        {'equipment': 'equipment2', 'condition2': False},
        {'equipment': 'equipment3', 'condition2': False},]
# alter_list

df = pd.DataFrame(columns=['condition1', 'condition2', 'condition3'], 
                  index=['equipment1', 'equipment2', 'equipment3'])
for alter in alter_list:
    equipment = alter.pop('equipment')
    for condition,v in alter.items():
        print(equipment, condition, v)
        df.loc[equipment, condition] = v   

结果:

print(df.fillna(''))

          condition1  condition2 condition3
equipment1       True        True      False
equipment2       True       False           
equipment3                  False

您可以创建一个空数据框,然后在有新数据时更新它

import pandas as pd


df = pd.DataFrame(
    index=[f'equipment{i}' for i in range(1, 4)], 
    columns=[f'condition{i}' for i in range(1, 4)]
)

print(df)

# update whenever you have the new data
df.loc['equipment1', 'condition1'] = True

print(df)

相关问题 更多 >