1

如何用 Pandas 重塑这个数据框

id | col1 | col2 | col3     | value  
-----------------------------------
1  | A1   | B1   | before   | 20     
2  | A1   | B1   | after    | 13
3  | A1   | B2   | before   | 11
4  | A1   | B2   | after    | 21
5  | A2   | B1   | before   | 18 
6  | A2   | B1   | after    | 22

...变成以下格式?

col1 | col2 | before  | after
-------------------------------
A1   | B1   | 20      | 13
A1   | B2   | 11      | 21
A1   | B1   | 18      | 22

编辑:第二个表的最后一行中的 A1 应该是 A2。

由于数据是配对的(例如“之前”和“之后”),我需要在没有“NAs”的情况下对齐列。

df.pivot(index='col1', columns='col3', values='value')

不起作用,因为col1不会产生唯一索引。我可以创建一个额外的列,这将导致唯一。这是唯一的出路吗?

4

2 回答 2

0

正如您的矩阵数据所示, col1 不能是索引,因为正如您所说,它“不会产生唯一索引”。

我认为你最好的最好的是:

grouped = df.groupby('col3')
pandas.merge(grouped.first(), grouped.last(), on=['col1','col2'])
于 2012-12-24T15:44:23.957 回答
0

你希望 col1 和 col2 在你旋转后看起来像什么?您的示例输出显示了最后一行的 A1 和 B1,但这些值都与 18 和 22 无关。我有几个选项:

In [234]: tmp = DataFrame(
    {'id':[1,2,3,4,5,6], 
     'col1':['A1','A1','A1','A1','A2','A2'],
     'col2':['B1','B1','B2','B2','B1','B2'],
     'col3':['before','after','before','after','before','after'],
     'value':[20,13,11,21,18,22]},
    columns=['id','col1','col2','col3','value'])

选项1:

In [236]: pivoted = pd.pivot_table(tmp, values='value',
                                        rows=['col1','col2'],
                                        cols=['col3'])
In [237]: pivoted
Out[237]:
col3       after  before
col1 col2
A1   B1       13      20
     B2       21      11
A2   B1      NaN      18
     B2       22     NaN

这听起来不像你想要的那种行为。

选项 2:

In [238]: pivoted = pivoted.fillna(method='bfill').dropna()
Out[238]:
col3       after  before
col1 col2
A1   B1       13      20
     B2       21      11
A2   B1       22      18

In [245]: pivoted.reset_index()
Out[245]:
col3 col1 col2  after  before
0      A1   B1     13      20
1      A1   B2     21      11
2      A2   B1     22      18

这让你非常接近。同样,我不确定您希望 col1 和 col2 如何表现,但这在前后列中具有正确的值。

于 2012-12-24T19:17:12.363 回答