基于列值拆分/扩展数据框

yln*_*nor 12 python pandas

我有一个如下所示的 DataFrame,将标识符作为现有日期索引之上的一列。

pd.DataFrame(index = [pd.to_datetime('2021-01-01'), pd.to_datetime('2021-01-01'),pd.to_datetime('2021-01-02'),pd.to_datetime('2021-01-02'), pd.to_datetime('2021-01-03'),pd.to_datetime('2021-01-03')], columns=['id','A', 'B'], data=[['foo',1,5],['bar',8,12],['foo',7,1], ['bar',5,1], ['foo',4,3],['bar',7,1]])

Out[6]: 
             id  A   B
2021-01-01  foo  1   5
2021-01-01  bar  8  12
2021-01-02  foo  7   1
2021-01-02  bar  5   1
2021-01-03  foo  4   3
2021-01-03  bar  7   1
Run Code Online (Sandbox Code Playgroud)

我的目标是为除 id 之外的每一列(A 和 B)创建一个新的子数据框,dateIndex 作为单个索引,id (foo, bar) 作为列名。预期输出如下所示:

A
Out[9]: 
            foo  bar
2021-01-01    1    8
2021-01-02    7    5
2021-01-03    4    7

B
Out[11]: 
            foo  bar
2021-01-01    5   12
2021-01-02    1    1
2021-01-03    3    1
Run Code Online (Sandbox Code Playgroud)

piR*_*red 20

A, B = map(df.set_index('id', append=True).unstack().get, ['A', 'B'])

print(A)

id          bar  foo
2021-01-01    8    1
2021-01-02    5    7
2021-01-03    7    4

print(B)

id          bar  foo
2021-01-01   12    5
2021-01-02    1    1
2021-01-03    1    3
Run Code Online (Sandbox Code Playgroud)


Qua*_*ang 10

这只是简单的:

out = df.set_index('id',append=True).unstack('id')
# if you have columns other than `A`,`B`:
# out = df.set_index('id',append=True)[['A','B']].unstack('id')
Run Code Online (Sandbox Code Playgroud)

那么你可以做

out['A']
Run Code Online (Sandbox Code Playgroud)

这使:

id          bar  foo
2021-01-01    8    1
2021-01-02    5    7
2021-01-03    7    4
Run Code Online (Sandbox Code Playgroud)

对于out['B']. 我发现这比将变量硬编码为A,B.


mao*_*aow 6

编辑:结合@piRSquared 的好主意map,除了pivot

IIn [58]: A, B = map(lambda column: df[['id', column]].pivot(columns='id', values=column), ['A', 'B'])

In [59]: A
Out[59]: 
id          bar  foo
date                
2021-01-01    8    1
2021-01-02    5    7
2021-01-03    7    4

In [60]: B
Out[60]: 
id          bar  foo
date                
2021-01-01   12    5
2021-01-02    1    1
2021-01-03    1    3
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 6

试试

out = df.set_index('id',append=True).stack().unstack('id').swaplevel(0,1)
A = out.loc['A',:]
A
Out[325]: 
id          bar  foo
2021-01-01    8    1
2021-01-02    5    7
2021-01-03    7    4
Run Code Online (Sandbox Code Playgroud)

或者

d = {x : df[[x,'id']].pivot(columns='id',values=x)  for x in ['A','B']}
d['A']
Out[336]: 
id          bar  foo
2021-01-01    8    1
2021-01-02    5    7
2021-01-03    7    4
Run Code Online (Sandbox Code Playgroud)

或者

df.pivot(columns='id').loc[:,'A']
Out[340]: 
id          bar  foo
2021-01-01    8    1
2021-01-02    5    7
2021-01-03    7    4
Run Code Online (Sandbox Code Playgroud)