【问题标题】:How to transfer multiple rows into columns in panda data frame?如何将多行传输到熊猫数据框中的列?
【发布时间】:2021-10-04 07:29:22
【问题描述】:

我有一个数据框如下:

  mydata_frame:
                 IDs   days                f1      f2      f3  ...  fn
                 Id1   day1                5       6       21  ...  5
                 Id1   delta_day0&day1     0       0       0   ...  0                     
                 Id1   day2                21      1       4   ...  2
                 Id1   delta_day1&day2     16      5       17  ...  3
                 Id1   day3                30      2       5   ...  2
                 Id1   delta_day2&day3     9       1       1   ...   0
                 ...     ...        ..      ..      ..  ... ...
                 Id2   day1                8       9       10  ...  2
                 Id2   delta_day0&day1     0       0       0   ...  0                     
                 Id2   day2                12      10      7   ...  6
                 Id2   delta_day1&day2     4       1       3  ...   4
                 Id2   day3                22      25      3   ...  1
                 Id2   delta_day2&day3     10       15     4   ...  5

我想将包含 delta 的所有行的值转移到列中。所以我想要的输出应该是这样的:

    output:
                 IDs   days         f1    del_f1   f2  del_f2     f3  del_f3  ...  fn  del_fn
                 Id1   day1         5       0       6    0        21   0      ...  5      0
                 Id1   day2         21      16      1    5        4    17     ...  2      3
                 Id1   day3         30      9       2    1        5    1      ...  2      0
                 ...     ...        ..      ..      ..  ... ...
                 Id2   day1         8       0       9    0        10   0      ...  2      0                    
                 Id2   day2         12      4       10   1        7    3      ...  6      4
                 Id2   day3         22      10      25   15       3    4      ...  1      5

有什么想法可以有效地进行这种转换吗?

【问题讨论】:

    标签: python dataframe multiple-columns data-conversion


    【解决方案1】:

    你可以这样做:

    df1 = df[df.days.str.startswith("day")].reset_index(drop=True)
    df2 = (
        df.loc[df.days.str.startswith("delta"), df.columns[2:]]
        .rename(columns={c: f"del_{c}" for c in df.columns[2:]})
        .reset_index(drop=True)
    )
    df = pd.concat([df1, df2], axis="columns")
    

    n == 3 和以下示例数据框 df 的结果

        IDs             days  f1  f2  f3
    0   Id1             day1   5   6  21
    1   Id1  delta_day0&day1   0   0   0
    2   Id1             day2  21   1   4
    3   Id1  delta_day1&day2  16   5  17
    4   Id1             day3  30   2   5
    5   Id1  delta_day2&day3   9   1   1
    6   Id2             day1   8   9  10
    7   Id2  delta_day0&day1   0   0   0
    8   Id2             day2  12  10   7
    9   Id2  delta_day1&day2   4   1   3
    10  Id2             day3  22  25   3
    11  Id2  delta_day2&day3  10  15   4
    

       IDs  days  f1  f2  f3  del_f1  del_f2  del_f3
    0  Id1  day1   5   6  21       0       0       0
    1  Id1  day2  21   1   4      16       5      17
    2  Id1  day3  30   2   5       9       1       1
    3  Id2  day1   8   9  10       0       0       0
    4  Id2  day2  12  10   7       4       1       3
    5  Id2  day3  22  25   3      10      15       4
    

    【讨论】:

    • Tnx,效果很好。
    【解决方案2】:

    您可以从无延迟(仅几天)构建数据框开始,即只保留从索引 0 开始的每两行。
    然后插入具有前一列延迟值的新列(从第 4 列,即索引 3)(从 1 开始每两行):

    df2 = df.iloc[::2]
    new_index = df2.index
    
    i = 3
    for col in df.columns[2:]:
        new_col = "del_" + col
        series = pd.Series(df[col].iloc[1::2])
        series.index = new_index
        df2.insert(i, new_col, series)
        i+=2
    
    print(df2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-20
      • 2021-05-19
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2014-07-04
      相关资源
      最近更新 更多