gpt4 book ai didi

python - pandas 数据透视表 - 重新排列

转载 作者:行者123 更新时间:2023-11-30 22:55:26 25 4
gpt4 key购买 nike

我有一个包含一些列的 pandas 数据框。我想以不同的方式重新排列它们。示例如下:

time,name,feature,value
33 20 May 2016 14:00:00 -0700,John,badL,2
45 19 May 2016 18:00:00 -0700,John,badL,1
120 17 May 2016 11:00:00 -0700,John,badL,1
220 20 May 2016 14:00:00 -0700,John,totalL,20
450 19 May 2016 18:00:00 -0700,John,totalL,15
330 18 May 2016 15:00:00 -0700,Mary,badL,2
330 18 May 2016 15:00:00 -0700,Mary,totalL,20
550 21 May 2016 12:00:00 -0700,Mary,adCmd,4
700 22 May 2016 16:00:00 -0700,Mary,PC,3
800 22 May 2016 16:00:00 -0700,Mary,eCon,200

注意:第一列值(时间)前面是索引值 (33, 45,120,...)。从上面的数据框中,我希望生成的数据框为:

time,name,badL,totalL,adCmd,PC,eCon
20 May 2016 14:00:00 -0700,John,2,20,0,0,0
19 May 2016 18:00:00 -0700,John,1,15,0,0,0
17 May 2016 11:00:00 -0700,John,1,0,0,0,0
18 May 2016 15:00:00 -0700,Mary,2,20,0,0,0
21 May 2016 12:00:00 -0700,Mary,0,0,4,0,0
22 May 2016 16:00:00 -0700,Mary,0,0,0,3,200

注意:5 月 17 日,John 没有任何总 L。所以,用0填充。

有没有一种优雅的方式来做到这一点?我将时间字段设置为 pd.to_datetime,然后进行比较......看起来很乏味。对于上面的例子,我只有两个“特征”(badL,totalL)。稍后我还会有更多。

这就是我所拥有的 - 但是,它为第二个功能添加了不同的行...(totalL)...而不是将其放在同一行中。

for f in ['badL', 'totalL']:
dff = df[df.feature == f]
print dff
if len(dff.index) > 0:
fullFeatureDf[f] = dff.feature_value

最佳答案

设置

from StringIO import StringIO
import pandas as pd

text = '''time,name,f1,value
20 May 2016 14:00:00 -0700,John,badL,2
19 May 2016 18:00:00 -0700,John,badL,1
17 May 2016 11:00:00 -0700,John,badL,1
20 May 2016 14:00:00 -0700,John,totalL,20
19 May 2016 18:00:00 -0700,John,totalL,15
17 May 2016 11:00:00 -0700,John,totalL,12
'''

df = pd.read_csv(StringIO(text))

print df

time name f1 value
0 20 May 2016 14:00:00 -0700 John badL 2
1 19 May 2016 18:00:00 -0700 John badL 1
2 17 May 2016 11:00:00 -0700 John badL 1
3 20 May 2016 14:00:00 -0700 John totalL 20
4 19 May 2016 18:00:00 -0700 John totalL 15
5 17 May 2016 11:00:00 -0700 John totalL 12

使用unstack的解决方案

df = df.set_index(['time', 'name', 'f1'])

print df

value
time name f1
20 May 2016 14:00:00 -0700 John badL 2
19 May 2016 18:00:00 -0700 John badL 1
17 May 2016 11:00:00 -0700 John badL 1
20 May 2016 14:00:00 -0700 John totalL 20
19 May 2016 18:00:00 -0700 John totalL 15
17 May 2016 11:00:00 -0700 John totalL 12

然后取消堆叠以执行透视。它获取行索引的一部分并将其移动为列。

print df.unstack()

value
f1 badL totalL
time name
17 May 2016 11:00:00 -0700 John 1 12
19 May 2016 18:00:00 -0700 John 1 15
20 May 2016 14:00:00 -0700 John 2 20
<小时/>

本质上,这是与 Yakym Pirozhenko 相同的解决方案。只是做法略有不同。这对我来说更直观,但对你来说可能不是。

关于python - pandas 数据透视表 - 重新排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37424539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com