我有一个如下所示的 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
.
编辑:结合@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)
试试
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)
归档时间: |
|
查看次数: |
530 次 |
最近记录: |