如何自动从熊猫表中分配变量?
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
这正是你想要的吗?如果是这样,那是我的荣幸。谢谢
【讨论】:
以上是关于如何自动从熊猫表中分配变量?的主要内容,如果未能解决你的问题,请参考以下文章