如何将多行传输到熊猫数据框中的列?

How to transfer multiple rows into columns in panda data frame?

我有一个数据框如下:

  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

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

您可以立即(仅几天)构建一个 Dataframe,即只保留从索引 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)

你可以这样做:

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