【问题标题】:Programaticallly re-organising pandas slices以编程方式重新组织熊猫切片
【发布时间】:2020-09-09 11:10:53
【问题描述】:

为清楚起见编辑

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

下面的数据框是参与者 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])

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

我需要能够在许多类似的数据帧中重复此操作,因此我需要一个更有用的解决方案,非常感谢任何帮助。

【问题讨论】:

  • 你能解释一下逻辑吗,其他参与者的数据在哪里?我的意思是你将如何区分一个参与者和另一个参与者的数据..
  • 我已经编辑了帖子以尝试解决这个问题,但是,手头的特定问题是重塑我在表一中显示的数据。当谈到合并数据时,我已经可以解决这个问题了。不过,感谢您指出所需的更改。
  • 包含items的列是否设置为数据框的索引?
  • 没有。由于工作表的格式,我不得不进行一些编辑以消除空行和列,但我没有设置 DF 的索引或列
  • 虽然每列都有一个标题,但我尚未将其指定为实际的列名,因此行和列都被编号而不是命名。感谢您提出问题以澄清任何帮助。

标签: python pandas dataframe data-munging


【解决方案1】:

创建并展平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

【讨论】:

  • 非常感谢您抽出宝贵的时间。当我尝试运行此代码时,我得到了keyerror 0 的回溯,我将继续尝试它并尝试使其工作。
  • 尝试使用引号'0'...或代替df[0] 使用df.iloc[:, 0]
  • 虽然这行得通,但它并没有给我上面显示的输出。它似乎跳过了前几列(而不仅仅是 items 列)。
  • 我正在尝试在一个非常相似的数据集上运行此答案,但出现错误:TypeError: sequence item 1: expected str instance, float found 知道这可能来自哪里吗?
猜你喜欢
  • 2012-02-01
  • 2021-08-10
  • 2020-03-17
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多