如何自动从熊猫表中分配变量?

Posted

技术标签:

【中文标题】如何自动从熊猫表中分配变量?【英文标题】:How to automate the assigment of variables from a table in pandas? 【发布时间】:2021-10-13 02:22:22 【问题描述】:

我有一个包含许多行的长表,我的目标是整理这张表,以便对不同的参数进行进一步分析。

df 看起来像这样:

    datetime                    value   type    description                 name
0   2018-01-01 00:30:00+01:00   0.22    HLN     HigLowNot                   NO2
1   2018-01-01 00:30:00+01:00   0.31    HLN     HighLowNot                  CO
2   2018-01-01 00:30:00+01:00   1.15    HLN     HighLowNot                  NO
3   2018-01-01 00:30:00+01:00   1.80    AIS     AllinSep                    NO2
4   2018-01-01 00:30:00+01:00   2.60    AIS     AllinSep                    CO
5   2018-01-01 00:30:00+01:00   2.30    AIS     AllinSep                    NO

这是一个简短的形式,有 20 个唯一名称和 2 种类型。

这是我目前所做的:

我按 typ HLN h = df[df['type'] == 'HLN'] 排序,并在一个 lon 表中获取该特定类型。

之后,我为每个名称创建一个子集,然后创建一个数据透视表。我想自动化这两个部分,因为它们总共有 40 行。那可能吗?提前致谢。:)

h_NO2 = h[h['name'] == 'NO2'] 
h_NO = h[h['name'] == 'NO']
h_CO = h[h['name'] == 'CO']
h_NO2_subset = h_NO2.pivot(index ="datetime", columns="description", values = "value")
h_NO_subset = h_NO.pivot(index ="datetime", columns="description", values = "value")
h_CO_subset = h_CO.pivot(index ="datetime", columns="description", values = "value")

【问题讨论】:

dfs = name : dataframe for name,dataframe in h.groupby('name') 应该做的伎俩然后dfs['NO2'] 调用数据帧,如果你有很多变量使用容器就是他们在那里 - 你可以添加任何额外的逻辑 - 例如旋转进入字典理解。 您可以按类型和名称对表格进行分组。之后,您可以创建数据透视表。 @Umar.H 感谢您的回答。我应该在哪里放置枢轴,也在 dfs 的支架中? name : dataframe.pivot(index="datetime", columns="description", values="value") for name,dataframe in h.groupby('name') 未经测试,但应该可以。 【参考方案1】:

使用字典作为容器:

dict_h = i: h[h['name'] == i]
          for i in h['name'].unique()
         
dict_h_subset = k: v.pivot(index="datetime",
                            columns="description",
                            values="value")
                 for k,v in dict_h.items()
                

然后按键访问结果:

dict_h_subset['NO2']

输出:

>>> dict_h
'NO2':                     datetime  value type description name
 0  2018-01-01 00:30:00+01:00   0.22  HLN   HigLowNot  NO2
 3  2018-01-01 00:30:00+01:00   1.80  AIS    AllinSep  NO2,
 'CO':                     datetime  value type description name
 1  2018-01-01 00:30:00+01:00   0.31  HLN  HighLowNot   CO
 4  2018-01-01 00:30:00+01:00   2.60  AIS    AllinSep   CO,
 'NO':                     datetime  value type description name
 2  2018-01-01 00:30:00+01:00   1.15  HLN  HighLowNot   NO
 5  2018-01-01 00:30:00+01:00   2.30  AIS    AllinSep   NO

>>> dict_h_subset
'NO2': description                AllinSep  HigLowNot
 datetime                                      
 2018-01-01 00:30:00+01:00       1.8       0.22,
 'CO': description                AllinSep  HighLowNot
 datetime                                       
 2018-01-01 00:30:00+01:00       2.6        0.31,
 'NO': description                AllinSep  HighLowNot
 datetime                                       
 2018-01-01 00:30:00+01:00       2.3        1.15

【讨论】:

感谢您的快速答复。我试过了,当我输入dict_h['NO2'] 时,表是空的,子集也是。 那么您的原始命令存在问题,因为我使用的命令完全相同(除非我错过了错字)。 h['name'].unique() 的输出是什么? 我运行了代码,它对我来说运行良好,请仔细检查 ;) 我的错,完美!现在我检查 Umar.H 的解决方案 还有一个问题。如何在dict_h_subset['NO2'] 中选择特定列?【参考方案2】:

请试试这个。

导入必要的包:

import pandas as pd
import numpy as np

准备测试数据:

df = pd.DataFrame('datetime': ['2018-01-01 00:30:00+01:00', 
                                '2018-01-01 00:30:00+01:00', 
                                '2018-01-01 00:30:00+01:00', 
                                '2018-01-01 00:30:00+01:00', 
                                '2018-01-01 00:30:00+01:00',
                                '2018-01-01 00:30:00+01:00'],
                   'value': [0.22, .031, 1.15, 1.80, 2.60, 2.30],
                   'type': ['HLN', 'HLN', 'HLN', 'AIS', 'AIS', 'AIS'],
                   'description': ['HighLowNot', 'HighLowNot', 'HighLowNot', 'AllinSep', 'AllinSep', 'AllinSep'],
                   'name': ['NO2', 'CO', 'NO', 'NO2', 'CO', 'NO'])

测试数据:

    datetime                    value   type    description name
0   2018-01-01 00:30:00+01:00   0.220   HLN     HighLowNot  NO2
1   2018-01-01 00:30:00+01:00   0.031   HLN     HighLowNot  CO
2   2018-01-01 00:30:00+01:00   1.150   HLN     HighLowNot  NO
3   2018-01-01 00:30:00+01:00   1.800   AIS     AllinSep    NO2
4   2018-01-01 00:30:00+01:00   2.600   AIS     AllinSep    CO
5   2018-01-01 00:30:00+01:00   2.300   AIS     AllinSep    NO

遍历类型和名称以提取子集:

splitted_result = []

# loop the unique items of 'type' column
for type in np.unique(df['type']):    
    # loop the unique items of 'name' column
    for name in np.unique(df['name']):
        print('-------------------')
        print('type : , name : '.format(type, name))

        # extract rows which has the specific name
        temp = df.loc[((df['type'] == type) & (df['name'] == name))]
        subset = temp.pivot(index ="datetime", columns="description", values = "value")
        print(subset)
        splitted_result.append(f'type_name_subset': subset)

这是结果:

-------------------
type : AIS, name : CO
description                AllinSep
datetime                           
2018-01-01 00:30:00+01:00       2.6
-------------------
type : AIS, name : NO
description                AllinSep
datetime                           
2018-01-01 00:30:00+01:00       2.3
-------------------
type : AIS, name : NO2
description                AllinSep
datetime                           
2018-01-01 00:30:00+01:00       1.8
-------------------
type : HLN, name : CO
description                HighLowNot
datetime                             
2018-01-01 00:30:00+01:00       0.031
-------------------
type : HLN, name : NO
description                HighLowNot
datetime                             
2018-01-01 00:30:00+01:00        1.15
-------------------
type : HLN, name : NO2
description                HighLowNot
datetime                             
2018-01-01 00:30:00+01:00        0.22

这正是你想要的吗?如果是这样,那是我的荣幸。谢谢

【讨论】:

以上是关于如何自动从熊猫表中分配变量?的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫中分配线条颜色

在熊猫中分配线条颜色

如何查找变量是在堆栈还是堆中分配?

如何在一个表的键中分配多个值?

Swift 没有从 JSON 结果中分配变量

如何在熊猫 df 列中分配列表值?