gpt4 book ai didi

python - 如何将两列 Pandas 数据框移动和堆叠成一列?

转载 作者:行者123 更新时间:2023-12-04 14:43:53 57 4
gpt4 key购买 nike

我有一个下面提到的数据框:

                   ETHNIC            SEX  USUBJID
0 HISPANIC OR LATINO F 16
1 HISPANIC OR LATINO M 8
2 HISPANIC OR LATINO Total__##!!?? 24
3 NOT HISPANIC OR LATINO F 25
4 NOT HISPANIC OR LATINO M 18
5 NOT HISPANIC OR LATINO Total__##!!?? 43
6 Total__##!!?? F 41
7 Total__##!!?? M 26
8 Total__##!!?? Total__##!!?? 67

只需将上面的数据框复制到剪贴板并执行df = pd.read_clipboard('\s\s+')加载上面的数据框。

我正在尝试将其转换为以下数据框:

                  stacked USUBJID
0 HISPANIC OR LATINO NaN <-----
0 F 16
1 M 8
2 Total__##!!?? 24
0 NOT HISPANIC OR LATINO NaN <-----
3 F 25
4 M 18
5 Total__##!!?? 43
0 Total__##!!?? NaN <-----
6 F 41
7 M 26
8 Total__##!!?? 67

我要堆叠 ETHNICSEX列在 ETHNIC 的值下ETHNIC 中每个唯一值的列列。

我正在尝试这样的方法,它可以工作,但我认为这不是一个可靠的解决方案。我试图将其拆分为 n (其中 n 是 EHTNIC 列中唯一值的数量)列表中的数据帧,每个数据帧切片都有一个空行,然后最后连接数据帧切片的列表并完成其余工作。

cols = ['ETHNIC',  'SEX']
results = []
for v in df[cols[0]].unique():
results.append(pd.DataFrame([[None]*df.shape[1]], columns=df.columns))
results.append(df[df[cols[0]].eq(v)])

results = pd.concat(results)
results[cols[0]] = results[cols[0]].bfill()
results['stacked'] = results.apply(lambda x: x['SEX'] if x['SEX'] else x['ETHNIC'], axis=1)
results = results.drop(columns=cols)[['stacked', 'USUBJID']]

最佳答案

首先使用 pandas.DataFrame.groupby 对“ETHNIC”进行分组.

每个组将包含一个 DataFrame 并仅保留 ['SEX', 'USUBJID'] 列,只是“SEX”的名称不同,使用 pandas.DataFrame.rename 更改.

标题被添加到组名 d.name 并使用 pandas.concat 与组 DataFrame 连接

最后,由操作产生的 MultiIndex 的第一级被删除 pandas.DataFrame.reset_index

(df.groupby('ETHNIC')
.apply(lambda d: pd.concat([pd.DataFrame([{'stacked': d.name, 'USUBJID': np.NaN}]),
d[['SEX', 'USUBJID']].rename(columns={'SEX': 'stacked'})
]))
.reset_index(level=0, drop=True)
)

输出:

                  stacked  USUBJID
0 HISPANIC OR LATINO NaN
0 F 16.0
1 M 8.0
2 Total__##!!?? 24.0
0 NOT HISPANIC OR LATINO NaN
3 F 25.0
4 M 18.0
5 Total__##!!?? 43.0
0 Total__##!!?? NaN
6 F 41.0
7 M 26.0
8 Total__##!!?? 67.0

关于python - 如何将两列 Pandas 数据框移动和堆叠成一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68466381/

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