如何使用 pandas 将 Series 重新排列为 DataFrame
How to rearrange a Series to DataFrame using pandas
我有一个 Series
如下:
In [37]: ser
Out[37]:
Aa 0
Ab 1
Ac 2
Ba 3
Bb 4
Bc 5
Ca 6
Cb 7
Cc 8
dtype: int3
我想将其重新排列为 DataFrame
为:
a b c
A 0 1 2
B 3 4 5
C 6 7 8
这是我试过但没有成功的方法:
In [38]: ser.groupby(lambda i: i[0]).apply(lambda x: x.rename({i: i[1] for i in x.index}).to_frame())
Out[38]:
A B C
A a 0 NaN NaN
b 1 NaN NaN
c 2 NaN NaN
B a NaN 3 NaN
b NaN 4 NaN
c NaN 5 NaN
C a NaN NaN 6
b NaN NaN 7
c NaN NaN 8
编辑
我发现了以下关闭结果:
In [50]: ser.groupby(lambda i: i[0]).apply(lambda x: x.rename({i: i[1] for i in x.index}).to_frame().transpose())
Out[50]:
a b c
A A 0 1 2
B B 3 4 5
C C 6 7 8
但是,它有一个MultiIndex
。
给你:
ser.groupby(lambda i: i[0]).apply(lambda x: x.rename({i: i[1] for i in x.index})).unstack()
你很接近!
为了清楚起见,我会更详细一些。
import pandas as pd
import itertools
# set up the Series
labels = map(''.join, itertools.product('ABC', 'abc'))
s = pd.Series(range(len(labels)), index=labels, name='data')
# transform to desired DataFrame
df = s.reset_index()
df['capital'] = df['index'].map(lambda s:s[0])
df['lowercase'] = df['index'].map(lambda s:s[1])
df = df.pivot(index='capitals', columns='lowercase', values='data')
这会从
转换一个系列 s
Aa 0
Ab 1
Ac 2
Ba 3
Bb 4
Bc 5
Ca 6
Cb 7
Cc 8
Name: data, dtype: int64
到 DataFrame df
lowercase a b c
capitals
A 0 1 2
B 3 4 5
C 6 7 8
In [235]:
df = pd.DataFrame(data = { 'key' : ser.index.values , 'value' :ser.values })
df
Out[235]:
key value
0 Aa 0
1 Ab 1
2 Ac 2
3 Ba 3
4 Bb 4
5 Bc 5
6 Ca 6
7 Cb 7
8 Cc 8
In [251]:
df['key_1'] = df.key.str.extract('(^\w)')
df
Out[251]:
key value key_1
0 Aa 0 A
1 Ab 1 A
2 Ac 2 A
3 Ba 3 B
4 Bb 4 B
5 Bc 5 B
6 Ca 6 C
7 Cb 7 C
8 Cc 8 C
In [252]:
df['key_2'] = df.key.str.extract('(\w$)')
df
Out[252]:
key value key_1 key_2
0 Aa 0 A a
1 Ab 1 A b
2 Ac 2 A c
3 Ba 3 B a
4 Bb 4 B b
5 Bc 5 B c
6 Ca 6 C a
7 Cb 7 C b
8 Cc 8 C c
In [253]:
df.pivot(index='key_1' , columns='key_2' , values='value')
Out[253]:
key_2 a b c
key_1
A 0 1 2
B 3 4 5
C 6 7 8
我有一个 Series
如下:
In [37]: ser
Out[37]:
Aa 0
Ab 1
Ac 2
Ba 3
Bb 4
Bc 5
Ca 6
Cb 7
Cc 8
dtype: int3
我想将其重新排列为 DataFrame
为:
a b c
A 0 1 2
B 3 4 5
C 6 7 8
这是我试过但没有成功的方法:
In [38]: ser.groupby(lambda i: i[0]).apply(lambda x: x.rename({i: i[1] for i in x.index}).to_frame())
Out[38]:
A B C
A a 0 NaN NaN
b 1 NaN NaN
c 2 NaN NaN
B a NaN 3 NaN
b NaN 4 NaN
c NaN 5 NaN
C a NaN NaN 6
b NaN NaN 7
c NaN NaN 8
编辑 我发现了以下关闭结果:
In [50]: ser.groupby(lambda i: i[0]).apply(lambda x: x.rename({i: i[1] for i in x.index}).to_frame().transpose())
Out[50]:
a b c
A A 0 1 2
B B 3 4 5
C C 6 7 8
但是,它有一个MultiIndex
。
给你:
ser.groupby(lambda i: i[0]).apply(lambda x: x.rename({i: i[1] for i in x.index})).unstack()
你很接近!
为了清楚起见,我会更详细一些。
import pandas as pd
import itertools
# set up the Series
labels = map(''.join, itertools.product('ABC', 'abc'))
s = pd.Series(range(len(labels)), index=labels, name='data')
# transform to desired DataFrame
df = s.reset_index()
df['capital'] = df['index'].map(lambda s:s[0])
df['lowercase'] = df['index'].map(lambda s:s[1])
df = df.pivot(index='capitals', columns='lowercase', values='data')
这会从
转换一个系列s
Aa 0
Ab 1
Ac 2
Ba 3
Bb 4
Bc 5
Ca 6
Cb 7
Cc 8
Name: data, dtype: int64
到 DataFrame df
lowercase a b c
capitals
A 0 1 2
B 3 4 5
C 6 7 8
In [235]:
df = pd.DataFrame(data = { 'key' : ser.index.values , 'value' :ser.values })
df
Out[235]:
key value
0 Aa 0
1 Ab 1
2 Ac 2
3 Ba 3
4 Bb 4
5 Bc 5
6 Ca 6
7 Cb 7
8 Cc 8
In [251]:
df['key_1'] = df.key.str.extract('(^\w)')
df
Out[251]:
key value key_1
0 Aa 0 A
1 Ab 1 A
2 Ac 2 A
3 Ba 3 B
4 Bb 4 B
5 Bc 5 B
6 Ca 6 C
7 Cb 7 C
8 Cc 8 C
In [252]:
df['key_2'] = df.key.str.extract('(\w$)')
df
Out[252]:
key value key_1 key_2
0 Aa 0 A a
1 Ab 1 A b
2 Ac 2 A c
3 Ba 3 B a
4 Bb 4 B b
5 Bc 5 B c
6 Ca 6 C a
7 Cb 7 C b
8 Cc 8 C c
In [253]:
df.pivot(index='key_1' , columns='key_2' , values='value')
Out[253]:
key_2 a b c
key_1
A 0 1 2
B 3 4 5
C 6 7 8