以编程方式重新组织 pandas 个切片

Programaticallly re-organising pandas slices

为清楚起见进行编辑

我有一组需要以编程方式组合的数据帧。每个人代表一组治疗过程中的特定参与者。每个框架来自 excel 工作簿的 1 sheet(每个客户一个工作簿,每个心理测量工具 1 个工作sheet),我已将其导入 pandas.

下面的数据框是参与者a,工具a的示例:

|           | beaseline     | time 1    | time 1 change     | time 1 change from baseline   | time 2    | time 2 change     | time 2 change from baseline   |
|---------  |-----------    |--------   |---------------    |-----------------------------  |--------   |---------------    |-----------------------------  |
| item 1    | 3             | 4         | Nan               | 1                             | 4         | 0                 | 1                             |
| item 2    | 3             | 2         | Nan               | 0                             | 3         | 1                 | 0                             |
| item 3    | 1             | 1         | Nan               | 0                             | 2         | 1                 | 1                             |
| item 4    | 1             | 1         | Nan               | 0                             | 1         | 0                 | 0                             |
| item 5    | 1             | 2         | Nan               | 1                             | 1         | -1                | 0                             |

我需要将其与表格数据框中其他参与者的观察相结合,这样每一行都是参与者,每一列都是在特定时间点对项目的响应.*

所以我需要将这些数据重塑成这样的东西:

|       | Baseline item 1   | Baseline item 2   | Baseline item 3   | Baseline item 4   | Baseline item 5   | time 1 item 1     | time 1 item 2     |
|---    |-----------------  |-----------------  |-----------------  |-----------------  |-----------------  |---------------    |---------------    |
| 0     | 3                 | 3                 | 1                 | 1                 | 1                 | 4                 | 2                 |

一旦我为每个数据帧完成了重塑,我就可以将它们附加在一起并将客户端代码添加为第一列,从而区分每个参与者。

|       | Client code   | Baseline item 1   | Baseline item 2   | Baseline item 3   | Baseline item 4   | Baseline item 5   | time 1 item 1     | time 1 item 2     |
|---    |-------------  |-----------------  |-----------------  |-----------------  |-----------------  |-----------------  |---------------    |---------------    |
| 0     | xxi212121     | 3                 | 3                 | 1                 | 1                 | 1                 | 4                 | 2                 |               | 4                 | 2                 |

我已经使用了很多重复的代码,基本上手动将每个切片拉成一个系列,重命名它然后创建一个新的数据帧:

baseline = pd.Dataframe(raw_data.iloc[2:,1])
time_1 = pd.Dataframe(raw_data.iloc[2:,2])

但显然这是一个非常愚蠢的解决方案。

我需要能够在很多类似的数据帧中重复这个,所以我需要一个更有用的解决方案,任何帮助将不胜感激。

创建并展平 MultiIndex 列,然后使用 np.hstack 水平堆叠数据框中的所有行,并从具有展平列的 stacked 行创建一个新数据框:

i = pd.MultiIndex.from_product([df.columns[1:], df.iloc[:, 0]]).map('-'.join)
s = pd.DataFrame([np.hstack(df.to_numpy()[:, 1:].T)], columns=i)

示例(为简单起见删除了列名):

print(df)

        0  1  2    3  4  5  6  7
0  item 1  3  4  Nan  1  4  0  1
1  item 2  3  2  Nan  0  3  1  0
2  item 3  1  1  Nan  0  2  1  1
3  item 4  1  1  Nan  0  1  0  0
4  item 5  1  2  Nan  1  1 -1  0

print(s)

   1-item 1  1-item 2  1-item 3  1-item 4  1-item 5  2-item 1  2-item 2  2-item 3  2-item 4  2-item 5 3-item 1 3-item 2 3-item 3 3-item 4 3-item 5  4-item 1  4-item 2  4-item 3  4-item 4  4-item 5  5-item 1  5-item 2  5-item 3  5-item 4  5-item 5  6-item 1  6-item 2  6-item 3  6-item 4  6-item 5  7-item 1  7-item 2  7-item 3  7-item 4  7-item 5
0         3         3         1         1         1         4         2         1         1         2      Nan      Nan      Nan      Nan      Nan         1         0         0         0         1         4         3         2         1         1         0         1         1         0        -1         1         0         1         0         0