使用自定义列名将数据框从长到宽转换

时间:2019-03-20 01:22:21

标签: python-3.x pandas

我正在尝试将一个长数据帧转换为一个宽数据帧,但似乎无法使任何东西按我需要的方式工作。我试过使用转置,融合,旋转,但语法不正确。如果您需要更多信息,请告诉我。您能提供的任何帮助将不胜感激!

详细信息:

原始长桌

| Emp_ID | attempt | results | name | date    |
|--------|---------|---------|------|---------|
| 123    |1        |fail     |John  |1/21/2019|
| 123    |2        |pass     |John  |1/21/2019|
| 145    |1        |fail     |Todd  |2/04/2019|
| 145    |2        |fail     |Todd  |2/05/2019|
| 145    |3        |pass     |Todd  |2/05/2019|
| 656    |1        |pass     |Sarah |3/02/2019|
| 767    |1        |pass     |Jim   |3/14/2019|
| 3453   |1        |fail     |Rose  |3/15/2019|
| 3453   |2        |pass     |Rose  |3/15/2019|

新宽表:我需要的样子(我只包括3条记录,因为它要花很长时间才能写出来,但是理想情况下,我需要新格式的原始表中的所有记录):

| Emp_ID | attempt1_results | attempt1_name | attempt1_date | attempt2_results | attempt2_name | attempt2_ date | attempt3_results | attempt3_name | attempt3_date |
|--------|------------------|---------------|---------------|------------------|---------------|----------------|------------------|---------------|---------------|
| 123    |fail              |John           |1/21/2019      |pass              |John           |1/21/2019       |                  |               |               |        
| 145    |fail              |Todd           |2/04/2019      |fail              |Todd           |2/05/2019       |pass              |Todd           |2/05/2019      |
| 656    |pass              |Sarah          |3/02/2019      |                  |               |                |                  |               |               |

代码:我尝试了一些不同的操作,但正如我所说,我无法使它们正常工作:

数据: df = pd.read_csv(self.results_file_path)

融合:

df1 = df(id_vars=['Emp_ID'], value_vars=list(df.columns), var_name=None, col_level=0)

取消堆叠:

d1 = df.set_index(['Emp_Id', 'attempt', 'results', 'name', 'date']).unstack()
d1.columns = d1.columns.map(lambda x: '{}attempt_{}'.format(*x))
d1.reset_index(inplace=True)

枢轴

d2 = df.pivot(index='Emp_ID', columns=('attempt', 'results', 'name', 'date'))

0 个答案:

没有答案