【问题标题】:Stack dataframes in Pandas vertically and horizontally在 Pandas 中垂直和水平堆叠数据框
【发布时间】:2022-08-23 04:39:47
【问题描述】:

我有一个看起来像这样的数据框:

country,region,region_id,year,doy,variable_a,num_pixels
USA, Iowa,12345,2022,1,32.2,100
USA, Iowa,12345,2022,2,12.2,100
USA, Iowa,12345,2022,3,22.2,100
USA, Iowa,12345,2022,4,112.2,100
USA, Iowa,12345,2022,5,52.2,100

上面数据框中的年份是 2022 年。从 2010 年开始,我有更多其他年份的数据框。 我还有其他变量的数据框:variable_bvariable_c

我想将所有这些数据帧组合成一个数据帧,这样

  1. 年份垂直排列,一个在另一个之下

  2. 不同变量的数据水平列出。输出应如下所示:

    国家、地区、region_id、年份、doy、variable_a、variable_b、variable_c

    USA, Iowa,12345,2010,1,32.2,44,101

    USA, Iowa,12345,2010,2,12.2,76,2332

    ... ...

    USA, Iowa,12345,2022,1,321.2,444,501

    USA, Iowa,12345,2022,2,122.2,756,32

    实现这一目标的最有效方法是什么? 请注意,其他数据帧中的年份会有重叠,因此解决方案需要考虑到这一点,而不是留下 NaN 值。

标签: python pandas


【解决方案1】:

IIUC,这应该适合你:

data1 = {
    'country': {0: 'USA', 1: 'USA', 2: 'USA', 3: 'USA', 4: 'USA'},
    'region': {0: ' Iowa', 1: ' Iowa', 2: ' Iowa', 3: ' Iowa', 4: ' Iowa'},
    'region_id': {0: 12345, 1: 12345, 2: 12345, 3: 12345, 4: 12345},
    'year': {0: 2022, 1: 2022, 2: 2022, 3: 2022, 4: 2022},
    'doy': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
    'variable_a': {0: 32.2, 1: 12.2, 2: 22.2, 3: 112.2, 4: 52.2},
    'num_pixels': {0: 100, 1: 100, 2: 100, 3: 100, 4: 100}
}

data2 = {
    'country': {0: 'USB', 1: 'USB', 2: 'USB', 3: 'USB', 4: 'USB'},
    'region': {0: ' Iowb', 1: ' Iowb', 2: ' Iowb', 3: ' Iowb', 4: ' Iowb'},
    'region_id': {0: 12345, 1: 12345, 2: 12345, 3: 12345, 4: 12345},
    'year': {0: 2021, 1: 2021, 2: 2021, 3: 2021, 4: 2021},
    'doy': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
    'variable_b': {0: 32.2, 1: 12.2, 2: 22.2, 3: 112.2, 4: 52.2},
    'num_pixels': {0: 100, 1: 100, 2: 100, 3: 100, 4: 100}
}

data3 = {
    'country': {0: 'USC', 1: 'USC', 2: 'USC', 3: 'USC', 4: 'USC'},
    'region': {0: ' Iowc', 1: ' Iowc', 2: ' Iowc', 3: ' Iowc', 4: ' Iowc'},
    'region_id': {0: 12345, 1: 12345, 2: 12345, 3: 12345, 4: 12345},
    'year': {0: 2020, 1: 2020, 2: 2020, 3: 2020, 4: 2020},
    'doy': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
    'variable_c1': {0: 32.2, 1: 12.2, 2: 22.2, 3: 112.2, 4: 52.2},
    'variable_c2': {0: 32.2, 1: 12.2, 2: 22.2, 3: 112.2, 4: 52.2},
    'num_pixels': {0: 100, 1: 100, 2: 100, 3: 100, 4: 100}
}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.DataFrame(data3)

dfn = [df1, df2, df3]

pd.concat(dfn, axis=0).sort_values(['year', 'country', 'region']).reset_index(drop=True)

输出:

【讨论】:

  • 日期不符合用户要求的格式。应首先显示 2021 年的行。
  • 感谢您指出这一点,我更新并简化了我的答案。
  • 所以只是从我的答案中复制了逻辑?
【解决方案2】:

使用pd.concat 方法可以有效地做到这一点。该方法通过按垂直顺序列出所有数据框来完成工作,并为所有新变量创建新列。

这是我使用重复数据创建的 pd.concat 如何工作的示例。

代码

import pandas as pd

df1 = pd.DataFrame({"country": ["USA", "USA", "USA"], "region": ["Iowa", "Iowa", "Iowa"],
                    "region_id": [12345, 12345, 12345], "year": [2022, 2022, 2022], "doy": [1, 2, 3],
                    "variable_a": [32.2, 12.2, 22.2], "num_pixles": [100, 100, 100]})

df2 = pd.DataFrame({"country": ["USA", "USA", "USA"], "region": ["Iowa", "Iowa", "Iowa"],
                    "region_id": [12345, 12345, 12345], "year": [2020, 2020, 2020], "doy": [1, 2, 3],
                    "variable_b": [54.2, 62.2, 2.2], "num_pixles": [100, 100, 100]})

df_list = [df1, df2]  # list of dataframes

res = pd.concat(df_list) # concat the list of dataframes
res = res.sort_values(by="year").reset_index(drop=True)  # To make sure that the rows are sorted based on year
print(res)

输出

      country region  region_id  year  doy  variable_a  num_pixles  variable_b
0     USA   Iowa      12345  2020    1         NaN         100        54.2
1     USA   Iowa      12345  2020    2         NaN         100        62.2
2     USA   Iowa      12345  2020    3         NaN         100         2.2
3     USA   Iowa      12345  2022    1        32.2         100         NaN
4     USA   Iowa      12345  2022    2        12.2         100         NaN
5     USA   Iowa      12345  2022    3        22.2         100         NaN

【讨论】:

    猜你喜欢
    • 2015-05-16
    • 1970-01-01
    • 2019-04-04
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多