在 pandas 中旋转时出现问题(在 R 中展开)
Trouble pivoting in pandas (spread in R)
我在使用 pandas 中的 pd.pivot() 或 pivot_table() 函数时遇到一些问题。
我有这个:
df = pd.DataFrame({'site_id': {0: 'a', 1: 'a', 2: 'b', 3: 'b', 4: 'c', 5:
'c',6: 'a', 7: 'a', 8: 'b', 9: 'b', 10: 'c', 11: 'c'},
'dt': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1,6: 2, 7: 2, 8: 2, 9: 2, 10: 2, 11: 2},
'eu': {0: 'FGE', 1: 'WSH', 2: 'FGE', 3: 'WSH', 4: 'FGE', 5: 'WSH',6: 'FGE', 7: 'WSH', 8: 'FGE', 9: 'WSH', 10: 'FGE', 11: 'WSH'},
'kw': {0: '8', 1: '5', 2: '3', 3: '7', 4: '1', 5: '5',6: '2', 7: '3', 8: '5', 9: '7', 10: '2', 11: '5'}})
df
Out[140]:
dt eu kw site_id
0 1 FGE 8 a
1 1 WSH 5 a
2 1 FGE 3 b
3 1 WSH 7 b
4 1 FGE 1 c
5 1 WSH 5 c
6 2 FGE 2 a
7 2 WSH 3 a
8 2 FGE 5 b
9 2 WSH 7 b
10 2 FGE 2 c
11 2 WSH 5 c
我想要这个:
dt site_id FGE WSH
1 a 8 5
1 b 3 7
1 c 1 5
2 a 2 3
2 b 5 7
2 c 2 5
我什么都试过了!
df.pivot_table(index = ['site_id','dt'], values = 'kw', columns = 'eu')
或
df.pivot(index = ['site_id','dt'], values = 'kw', columns = 'eu')
应该有用。我也试过 unstack():
df.set_index(['dt','site_id','eu']).unstack(level = -1)
df.set_index(['dt', 'site_id', 'eu']).kw \
.unstack().rename_axis(None, 1).reset_index()
你最后一次尝试(unstack
)对我来说很好,我不确定为什么它给你带来了问题。 FWIW,我认为使用索引名称而不是级别更具可读性,所以我这样做了:
>>> df.set_index(['dt','site_id','eu']).unstack('eu')
kw
eu FGE WSH
dt site_id
1 a 8 5
b 3 7
c 1 5
2 a 2 3
b 5 7
c 2 5
但同样,您的方式对我来说看起来不错,并且与@piRSquared 所做的几乎相同(除了他们的回答添加了更多代码以摆脱多索引)。
我觉得pivot
的问题是你只能传递一个变量,不能传递一个列表?无论如何,这对我有用:
>>> df.set_index(['dt','site_id']).pivot(columns='eu')
对于 pivot_table
,主要问题是 'kw' 是一个 object/character,默认情况下 pivot_table
将尝试与 numpy.mean
聚合。您可能收到错误消息:"DataError: No numeric types to aggregate".
但是有一些解决方法。首先,您可以只转换为数字类型,然后使用相同的 pivot_table 命令
>>> df['kw'] = df['kw'].astype(int)
>>> df.pivot_table(index = ['dt','site_id'], values = 'kw', columns = 'eu')
或者您可以更改聚合函数:
>>> df.pivot_table(index = ['dt','site_id'], values = 'kw', columns = 'eu',
aggfunc=sum )
这是利用了字符串可以求和(连接)这一事实,即使您不能对它们取平均值。实际上,您可以在此处使用大多数对字符串进行操作的函数(包括 lambda)。
但是请注意,即使每个单元格只有一个值,pivot_table's
aggfunc
这里也需要某种归约操作,因此实际上没有任何要归约的!但是代码里有个check需要做归约操作,所以不得不做一个。
我在使用 pandas 中的 pd.pivot() 或 pivot_table() 函数时遇到一些问题。
我有这个:
df = pd.DataFrame({'site_id': {0: 'a', 1: 'a', 2: 'b', 3: 'b', 4: 'c', 5:
'c',6: 'a', 7: 'a', 8: 'b', 9: 'b', 10: 'c', 11: 'c'},
'dt': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1,6: 2, 7: 2, 8: 2, 9: 2, 10: 2, 11: 2},
'eu': {0: 'FGE', 1: 'WSH', 2: 'FGE', 3: 'WSH', 4: 'FGE', 5: 'WSH',6: 'FGE', 7: 'WSH', 8: 'FGE', 9: 'WSH', 10: 'FGE', 11: 'WSH'},
'kw': {0: '8', 1: '5', 2: '3', 3: '7', 4: '1', 5: '5',6: '2', 7: '3', 8: '5', 9: '7', 10: '2', 11: '5'}})
df
Out[140]:
dt eu kw site_id
0 1 FGE 8 a
1 1 WSH 5 a
2 1 FGE 3 b
3 1 WSH 7 b
4 1 FGE 1 c
5 1 WSH 5 c
6 2 FGE 2 a
7 2 WSH 3 a
8 2 FGE 5 b
9 2 WSH 7 b
10 2 FGE 2 c
11 2 WSH 5 c
我想要这个:
dt site_id FGE WSH
1 a 8 5
1 b 3 7
1 c 1 5
2 a 2 3
2 b 5 7
2 c 2 5
我什么都试过了!
df.pivot_table(index = ['site_id','dt'], values = 'kw', columns = 'eu')
或
df.pivot(index = ['site_id','dt'], values = 'kw', columns = 'eu')
应该有用。我也试过 unstack():
df.set_index(['dt','site_id','eu']).unstack(level = -1)
df.set_index(['dt', 'site_id', 'eu']).kw \
.unstack().rename_axis(None, 1).reset_index()
你最后一次尝试(unstack
)对我来说很好,我不确定为什么它给你带来了问题。 FWIW,我认为使用索引名称而不是级别更具可读性,所以我这样做了:
>>> df.set_index(['dt','site_id','eu']).unstack('eu')
kw
eu FGE WSH
dt site_id
1 a 8 5
b 3 7
c 1 5
2 a 2 3
b 5 7
c 2 5
但同样,您的方式对我来说看起来不错,并且与@piRSquared 所做的几乎相同(除了他们的回答添加了更多代码以摆脱多索引)。
我觉得pivot
的问题是你只能传递一个变量,不能传递一个列表?无论如何,这对我有用:
>>> df.set_index(['dt','site_id']).pivot(columns='eu')
对于 pivot_table
,主要问题是 'kw' 是一个 object/character,默认情况下 pivot_table
将尝试与 numpy.mean
聚合。您可能收到错误消息:"DataError: No numeric types to aggregate".
但是有一些解决方法。首先,您可以只转换为数字类型,然后使用相同的 pivot_table 命令
>>> df['kw'] = df['kw'].astype(int)
>>> df.pivot_table(index = ['dt','site_id'], values = 'kw', columns = 'eu')
或者您可以更改聚合函数:
>>> df.pivot_table(index = ['dt','site_id'], values = 'kw', columns = 'eu',
aggfunc=sum )
这是利用了字符串可以求和(连接)这一事实,即使您不能对它们取平均值。实际上,您可以在此处使用大多数对字符串进行操作的函数(包括 lambda)。
但是请注意,即使每个单元格只有一个值,pivot_table's
aggfunc
这里也需要某种归约操作,因此实际上没有任何要归约的!但是代码里有个check需要做归约操作,所以不得不做一个。