[英]How do I group pandas Dataframe columns into MultiIndex (row or column wise)?
我有一個 DataFrame ,它是從一個文件(一個非常混亂的文件)中讀取的( pd.read_csv
)。
我正在嘗試以一種我可以輕松地使用 plot 圖形之后使用Plotly Express 或將其用於其他目的(例如均值計算)的方式進行清理。
我已經稍微清理了一下,所以我有一個時間索引 ( pd.date_range
)。 每列可以按三重奏分組,並針對每個站點(污染、溫度和深度)重復。 我想從列名中提取站點編號(因為站點編號IS NOT
連續的)並用它來對我的DataFrame (或類似的東西)進行多索引。
這是我的 DataFrame 結構的示例(實際站點編號上升到 600 ans 不連續):
import pandas as pd
import numpy as np
df=pd.DataFrame(index=pd.date_range(start="2021-01", periods=12, freq='M'), data={"Site_101_Contamination":np.random.rand(12),"Site_101_Temperature":np.random.rand(12),"Site_101_Depth":np.random.rand(12),"Site_102_Contamination":np.random.rand(12),"Site_102_Temperature":np.random.rand(12),"Site_102_Depth":np.random.rand(12),"Site_103_Contamination":np.random.rand(12),"Site_103_Temperature":np.random.rand(12),"Site_103_Depth":np.random.rand(12),"Site_104_Contamination":np.random.rand(12),"Site_104_Temperature":np.random.rand(12),"Site_104_Depth":np.random.rand(12)})
df
我的問題有三個:
1- 我如何創建這個MultiIndexed DataFrame和 2 行索引(第一級:日期;第二級:站點編號)以及結果 3 列DataFrame (污染、溫度、深度)? 另外,我是否還應該將名稱添加到索引中(日期、site_no)——我該怎么做?
例如,對於問題 1,我希望最終的 DataFrame 看起來像什么:
污染 | 溫度 | 深度 | ||
---|---|---|---|---|
日期 | 站點號 | |||
2021-01 | 101 | 2.3423511 | 15.2345511 | 32.32556 |
... | ... | ... | ... | |
614 | 325.25560 | -5.23500120 | 252.0395 | |
... | ... | ... | ... | ... |
2021-12 | 101 | 2.3112394 | 19.2038412 | 39.23189 |
... | ... | ... | ... | |
614 | 305.56779 | -2.6798520 | 211.7794 |
2- 如何創建這個MultiIndexed DataFrame具有 1 行索引(日期),但在列上具有 2 個索引(第一級:[插入站點編號],第二級:污染、溫度、深度)?
例如,我希望問題 2 的最終 DataFrame 看起來像什么:
101 | (101,推斷) | (101,推斷) | ... | 614 | (614,推斷) | (614,推斷) | |
---|---|---|---|---|---|---|---|
污染 | 溫度 | 深度 | ... | 污染 | 溫度 | 深度 | |
日期 | |||||||
2021-01 | 2.3423511 | 15.2345511 | 32.32556 | ... | 325.25560 | -5.23500120 | 252.0395 |
... | ... | ... | ... | ... | ... | ||
2021-12 | 2.3112394 | 19.2038412 | 39.23189 | ... | 614 | 305.56779 | -2.6798520 |
3- 這些MultiIndexed DataFrame中的哪一個更符合 pythonic 或“最佳實踐”,為什么?
獎金問題:
4- 如果您的答案不是中等水平,是否可以添加有關如何使用此 MultiIndex 訪問值、列或行的信息(或鏈接)?
__
df.stack().unstack([1,2])
site_no 101 614
Contamination Temperature Depth Contamination Temperature Depth
date
2021-01 2.342351 15.234551 32.32556 325.25560 -5.235001 252.0395
2021-12 2.311239 19.203841 39.23189 305.56779 -2.679852 211.7794
編輯
使用新數據:
df1 = df.stack().reset_index()
df1[['site_no', 'Type']] = df1['level_1'].str.split('(?<=\\d)_', expand = True)
df1.pivot('level_0', ['site_no', 'Type'], 0)
site_no Site_101 ... Site_104
Type Contamination Temperature ... Temperature Depth
level_0 ...
2021-01-31 0.379259 0.419999 ... 0.907264 0.325225
2021-02-28 0.974815 0.305933 ... 0.529651 0.850517
2021-03-31 0.761665 0.431613 ... 0.525826 0.282361
2021-04-30 0.675198 0.455258 ... 0.273308 0.921283
2021-05-31 0.054640 0.379733 ... 0.425278 0.400155
2021-06-30 0.467902 0.863513 ... 0.293179 0.335472
2021-07-31 0.146240 0.052324 ... 0.925729 0.910898
2021-08-31 0.076072 0.347316 ... 0.130894 0.517572
2021-09-30 0.470561 0.530088 ... 0.245784 0.019819
2021-10-31 0.314711 0.611415 ... 0.130266 0.498167
2021-11-30 0.493516 0.627174 ... 0.846266 0.389009
2021-12-31 0.256572 0.309157 ... 0.860257 0.107073
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.