gpt4 book ai didi

python - 在 Pandas 中垂直和水平堆叠数据帧

转载 作者:行者123 更新时间:2023-12-02 01:31:52 25 4
gpt4 key购买 nike

我有一个如下所示的数据框:

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

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

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

  1. 年份按顺序垂直排列
  2. 不同变量的数据水平列出。输出应如下所示:
  country region  region_id  year  doy  variable_a  variable_b  variable_c
0 USA Iowa 12345 2010 1 32.2 44 101
1 USA Iowa 12345 2010 2 12.2 76 2332
..........................................................................
n-1 USA Iowa 12345 2022 1 321.2 444 501
n USA Iowa 12345 2022 2 122.2 756 32

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

最佳答案

我不确定人们是否听到了您问题的第二部分:

the data for the different variables is listed horizontally.

there will be overlap in years in the other dataframes so the solution needs to take that into account and not leave NaN values.

我想我明白了,这就是我的解决方案。

我们首先创建一个为期两年、每次五天、包含两个变量的婴儿数据集。

import pandas as pd

# Baseline dummy data
data = {
'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},
'num_pixels': {0: 100, 1: 100, 2: 100, 3: 100, 4: 100}
}

# 2022 data with "a" data
df_2022_a = pd.DataFrame(data)
df_2022_a["variable_a"] = range(5)

# 2022 data with "b" data
df_2022_b = pd.DataFrame(data)
df_2022_b["variable_b"] = range(5, 10)

# 2021 data with "a" data
df_2021_a = pd.DataFrame(data)
df_2021_a["variable_a"] = range(10, 15)
df_2021_a["year"] = 2021

# 2021 data with "b" data
df_2021_b = pd.DataFrame(data)
df_2021_b["variable_b"] = range(15, 20)
df_2021_b["year"] = 2021

frames = [df_2022_a, df_2022_b, df_2021_a, df_2021_b]

# Get the columns that they all share. This is what we'll group by.
# You can hard-code this if you want
common_cols = list(set.intersection(*(set(df.columns) for df in frames)))

# Yes, go ahead and concatenate them together... but there's one more step!
df = pd.concat(frames)
df

enter image description here

在这里,您留下了很多重复的日子和很多NaN。通过执行以下操作来折叠数据框:

output_df = (
df
.groupby(by=common_cols) # Only keep distinct values for the common cols
.max() # Max will prefer non-nan values over nans
.reset_index() # Collapse the multi-index
.sort_values(common_cols) # Sort by all these to get it nice and orderly
.reset_index(drop=True) # Tidy up the dataframe index
)
output_df

enter image description here

我相信这就是 OP 所要求的输出类型。

至于最终产品中没有 NaN,这将真正取决于所有年份和日期的所有变量的数据覆盖范围。

关于python - 在 Pandas 中垂直和水平堆叠数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73127093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com