簡體   English   中英

如何將 pandas Dataframe 列分組到 MultiIndex(按行或按列)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM