【问题标题】:Selecting specific columns in dataframe and append into new rows [duplicate]选择数据框中的特定列并附加到新行[重复]
【发布时间】:2018-12-13 16:37:10
【问题描述】:

我一直在想办法重新排列数据框。我的原始数据框如下所示:

df:

   YOB    Name   Treatment_1   Date_1       Treatment_2    Date_2
0  1974   John       A        2018-11-13         D         2018-12-13
1  1975   Jones      B        2018-11-14         E         2018-12-14
2  1976   Jack       C        2018-11-15         F         2018-12-15

现在我希望我的数据框在不同的行上显示不同的治疗信息

df:
   YOB    Name   Treatment   Date      
0  1974   John       A      2018-11-13         
1  1974   John       D      2018-12-13
2  1975   Jones      B      2018-11-14         
3  1975   Jones      E      2018-12-14
4  1976   Jack       C      2018-11-15         
5  1976   Jack       F      2018-12-15

任何人都可以帮助阐明这件事,因为我已经被困了好几天了。

在此感谢您

注意:我已对其进行了简化,但实际数据集将有 20 多个与治疗相关的列,有没有办法使用范围而不是输入每一列?很抱歉一开始没有说清楚

【问题讨论】:

  • 你试过什么?你有很多选择。考虑恰当命名的wide_to_long
  • pd.wide_to_long(df,['Treatment','Date'],i=['YOB','Name'],j='drop',sep='_').reset_index(level=[0,1])
  • 我已经尝试过wide_to_long,它可以工作,但是有没有更有效的方法而不是键入每一列,因为有超过22个相关列但具有相同的分隔符?很抱歉一开始没有说清楚:(
  • 我不这么认为,您必须在列上使用某种循环并单独“融化”每列然后合并结果,或者您可能必须编写一些正则表达式逻辑去获取列组在一起并为 pd.wide_to_long 构建参数,而无需输入完整列表。

标签: python python-3.x pandas dataframe jupyter-notebook


【解决方案1】:

使用pd.wide_to_long:

df = df.rename(columns={'Data_2':'Date_2'})  #Fix typo error first.

pd.wide_to_long(df, ['Date','Treatment'], i=['YOB','Name'], j='No', sep='_', suffix='\d+')\
  .reset_index()

输出:

    YOB   Name  No        Date Treatment
0  1974   John   1  2018-11-13         A
1  1974   John   2  2018-12-13         D
2  1975  Jones   1  2018-11-14         B
3  1975  Jones   2  2018-12-14         E
4  1976   Jack   1  2018-11-15         C
5  1976   Jack   2  2018-12-15         F

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2021-07-15
    • 2018-10-24
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多