以编程方式重新组织 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
为清楚起见进行编辑
我有一组需要以编程方式组合的数据帧。每个人代表一组治疗过程中的特定参与者。每个框架来自 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