[英]Combing Two Columns into Single Column on New Rows in Pandas Dataframe
我有一个看起来像这样的数据框:
ID | stu1 | stu2 |
---|---|---|
11 | 詹姆士 | 抢 |
22 | 鲍勃 | 汤姆 |
33 | 瑞安 | 伊恩 |
44 | 奥利弗 | 萨伊 |
55 | 伯特 | 本 |
66 | 克里斯 | 富有的 |
要将 stu1 和 stu2 组合成一个列,每个名称都在一个新行上(并为每个名称复制 id),我使用了这个:
stu_df = stu_df.set_index('id').stack().reset_index(level=1, drop=True).to_frame('stu').reset_index()
这给出了这个结果:
ID | 斯图 |
---|---|
11 | 詹姆士 |
11 | 抢 |
22 | 鲍勃 |
22 | 汤姆 |
33 | 瑞安 |
33 | 伊恩 |
44 | 奥利弗 |
44 | 萨伊 |
55 | 伯特 |
55 | 本 |
66 | 克里斯 |
66 | 富有的 |
原始数据框已更新为包含日期,如下所示:
日期 | ID | stu1 | stu2 |
---|---|---|---|
2022 年 3 月 6 日 | 11 | 詹姆士 | 抢 |
2022 年 3 月 6 日 | 22 | 鲍勃 | 汤姆 |
2022 年 3 月 6 日 | 33 | 瑞安 | 伊恩 |
2022 年 3 月 6 日 | 44 | 奥利弗 | 萨伊 |
2022 年 3 月 6 日 | 55 | 伯特 | 本 |
2022 年 3 月 6 日 | 66 | 克里斯 | 富有的 |
我想以相同的方式组合 stu1 和 stu2 (复制每个名称的日期和 id)但无法使其工作。
期望的结果是这样的:
日期 | ID | 斯图 |
---|---|---|
2022 年 3 月 6 日 | 11 | 詹姆士 |
2022 年 3 月 6 日 | 11 | 抢 |
2022 年 3 月 6 日 | 22 | 鲍勃 |
2022 年 3 月 6 日 | 22 | 汤姆 |
2022 年 3 月 6 日 | 33 | 瑞安 |
2022 年 3 月 6 日 | 33 | 伊恩 |
2022 年 3 月 6 日 | 44 | 奥利弗 |
2022 年 3 月 6 日 | 44 | 萨伊 |
2022 年 3 月 6 日 | 55 | 伯特 |
2022 年 3 月 6 日 | 55 | 本 |
2022 年 3 月 6 日 | 66 | 克里斯 |
2022 年 3 月 6 日 | 66 | 富有的 |
我是 Pandas 的新手,正在苦苦挣扎。 任何人都可以帮忙吗? 谢谢
我建议使用 panda 的 melt 功能,如下所示:
import pandas as pd
# a sample of your dataframe
df = pd.DataFrame({
'date' : ['03/06/2022', '03/06/2022', '03/06/2022'],
'id' : [11,22,33],
'stu1' : ['James', 'Bob', 'Ryan' ],
'stu2' : ['James', 'Rob', 'Tom' ]})
# melt the dataframe
df_melted = df.melt(id_vars=['date', 'id'], value_vars= ['stu1', 'stu2'])
print(df_melted)
>>>
date id variable value
0 03/06/2022 11 stu1 James
1 03/06/2022 22 stu1 Bob
2 03/06/2022 33 stu1 Ryan
3 03/06/2022 11 stu2 James
4 03/06/2022 22 stu2 Rob
5 03/06/2022 33 stu2 Tom
如果您根本不关心有助于识别名称来源(来自哪个列)的列变量,那么您可以简单地删除它。
您还可以自定义输出变量的名称(而不是variable和value )。 这是一个获得您想要的确切输出的示例:
df.melt(id_vars=['date', 'id'], value_vars= ['stu1', 'stu2'], value_name='stu').drop(['variable'], axis = 1)
查看原始文档pandas.melt了解更多信息!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.