我见过很多关于透视表的问题。即使他们不知道他们在询问透视表,他们通常是。几乎不可能写出一个包含旋转所有方面的标准问答。。。。
。。。但我要试一试。
现有问题和答案的问题是,问题通常集中在OP难以概括的细微差别上,以便使用一些现有的好答案。然而,没有一个答案试图给出一个全面的解释(因为这是一项艰巨的任务)
看看我的google search中的几个例子
pd.DataFrame.pivot
因此,每当有人搜索pivot
时,他们都会得到零星的结果,这些结果很可能无法回答他们的特定问题。
您可能会注意到,我显著地命名了我的列和相关的列值,以对应于下面的答案中我将如何旋转。请注意,这样您就可以熟悉哪些列名要到哪里才能得到您要查找的结果。
import numpy as np
import pandas as pd
from numpy.core.defchararray import add
np.random.seed([3,1415])
n = 20
cols = np.array(['key', 'row', 'item', 'col'])
arr1 = (np.random.randint(5, size=(n, 4)) // [2, 1, 2, 1]).astype(str)
df = pd.DataFrame(
add(cols, arr1), columns=cols
).join(
pd.DataFrame(np.random.rand(n, 2).round(2)).add_prefix('val')
)
print(df)
key row item col val0 val1
0 key0 row3 item1 col3 0.81 0.04
1 key1 row2 item1 col2 0.44 0.07
2 key1 row0 item1 col0 0.77 0.01
3 key0 row4 item0 col2 0.15 0.59
4 key1 row0 item2 col1 0.81 0.64
5 key1 row2 item2 col4 0.13 0.88
6 key2 row4 item1 col3 0.88 0.39
7 key1 row4 item1 col1 0.10 0.07
8 key1 row0 item2 col4 0.65 0.02
9 key1 row2 item0 col2 0.35 0.61
10 key2 row0 item2 col1 0.40 0.85
11 key2 row4 item1 col2 0.64 0.25
12 key0 row2 item2 col3 0.50 0.44
13 key0 row4 item1 col4 0.24 0.46
14 key1 row3 item2 col3 0.28 0.11
15 key0 row3 item1 col1 0.31 0.23
16 key0 row0 item2 col3 0.86 0.01
17 key0 row4 item0 col3 0.64 0.21
18 key2 row2 item2 col0 0.13 0.45
19 key0 row2 item0 col4 0.37 0.70
为什么我得到ValueError: Index contains duplicate entries, cannot reshape
如何旋转df
,使col
值是列,row
值是索引,val0
的平均值是值?
col col0 col1 col2 col3 col4
row
row0 0.77 0.605 NaN 0.860 0.65
row2 0.13 NaN 0.395 0.500 0.25
row3 NaN 0.310 NaN 0.545 NaN
row4 NaN 0.100 0.395 0.760 0.24
如何旋转df
,使col
值是列,row
值是索引,val0
的平均值是值,缺少的值是0
?
col col0 col1 col2 col3 col4
row
row0 0.77 0.605 0.000 0.860 0.65
row2 0.13 0.000 0.395 0.500 0.25
row3 0.00 0.310 0.000 0.545 0.00
row4 0.00 0.100 0.395 0.760 0.24
除了mean
之外,我还能买点别的吗,比如sum
?
col col0 col1 col2 col3 col4
row
row0 0.77 1.21 0.00 0.86 0.65
row2 0.13 0.00 0.79 0.50 0.50
row3 0.00 0.31 0.00 1.09 0.00
row4 0.00 0.10 0.79 1.52 0.24
我可以一次多做一个聚合吗?
sum mean
col col0 col1 col2 col3 col4 col0 col1 col2 col3 col4
row
row0 0.77 1.21 0.00 0.86 0.65 0.77 0.605 0.000 0.860 0.65
row2 0.13 0.00 0.79 0.50 0.50 0.13 0.000 0.395 0.500 0.25
row3 0.00 0.31 0.00 1.09 0.00 0.00 0.310 0.000 0.545 0.00
row4 0.00 0.10 0.79 1.52 0.24 0.00 0.100 0.395 0.760 0.24
我可以聚合多个值列吗?
val0 val1
col col0 col1 col2 col3 col4 col0 col1 col2 col3 col4
row
row0 0.77 0.605 0.000 0.860 0.65 0.01 0.745 0.00 0.010 0.02
row2 0.13 0.000 0.395 0.500 0.25 0.45 0.000 0.34 0.440 0.79
row3 0.00 0.310 0.000 0.545 0.00 0.00 0.230 0.00 0.075 0.00
row4 0.00 0.100 0.395 0.760 0.24 0.00 0.070 0.42 0.300 0.46
可以按多个列细分吗?
item item0 item1 item2
col col2 col3 col4 col0 col1 col2 col3 col4 col0 col1 col3 col4
row
row0 0.00 0.00 0.00 0.77 0.00 0.00 0.00 0.00 0.00 0.605 0.86 0.65
row2 0.35 0.00 0.37 0.00 0.00 0.44 0.00 0.00 0.13 0.000 0.50 0.13
row3 0.00 0.00 0.00 0.00 0.31 0.00 0.81 0.00 0.00 0.000 0.28 0.00
row4 0.15 0.64 0.00 0.00 0.10 0.64 0.88 0.24 0.00 0.000 0.00 0.00
或者
item item0 item1 item2
col col2 col3 col4 col0 col1 col2 col3 col4 col0 col1 col3 col4
key row
key0 row0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.86 0.00
row2 0.00 0.00 0.37 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00
row3 0.00 0.00 0.00 0.00 0.31 0.00 0.81 0.00 0.00 0.00 0.00 0.00
row4 0.15 0.64 0.00 0.00 0.00 0.00 0.00 0.24 0.00 0.00 0.00 0.00
key1 row0 0.00 0.00 0.00 0.77 0.00 0.00 0.00 0.00 0.00 0.81 0.00 0.65
row2 0.35 0.00 0.00 0.00 0.00 0.44 0.00 0.00 0.00 0.00 0.00 0.13
row3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.28 0.00
row4 0.00 0.00 0.00 0.00 0.10 0.00 0.00 0.00 0.00 0.00 0.00 0.00
key2 row0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.40 0.00 0.00
row2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.13 0.00 0.00 0.00
row4 0.00 0.00 0.00 0.00 0.00 0.64 0.88 0.00 0.00 0.00 0.00 0.00
我可以汇总列和行一起出现的频率,也就是“交叉表”吗?
col col0 col1 col2 col3 col4
row
row0 1 2 0 1 1
row2 1 0 2 1 2
row3 0 1 0 2 0
row4 0 1 2 2 1
如何通过仅在两列上旋转将数据帧从长转换为宽?鉴于
np.random.seed([3, 1415])
df2 = pd.DataFrame({'A': list('aaaabbbc'), 'B': np.random.choice(15, 8)})
df2
A B
0 a 0
1 a 11
2 a 2
3 a 11
4 b 10
5 b 10
6 b 14
7 c 7
预期的应该看起来像
a b c
0 0.0 10.0 7.0
1 11.0 10.0 NaN
2 2.0 14.0 NaN
3 11.0 NaN NaN
如何在pivot
之后将多个索引展平为单个索引
从
1 2
1 1 2
a 2 1 1
b 2 1 0
c 1 0 0
到
1|1 2|1 2|2
a 2 1 1
b 2 1 0
c 1 0 0
我们首先回答第一个问题:
问题1
发生这种情况的原因是pandas试图用重复的条目重新索引
columns
或index
对象。可以使用各种方法来执行轴心点。其中一些不太适合当有重复的键被要求在其中旋转时。例如。考虑一下pd.DataFrame.pivot
。我知道有重复的条目共享row
和col
值:所以当我使用
我知道上面提到的错误。事实上,当我尝试执行相同的任务时,会遇到相同的错误:
下面是一个我们可以用来转换的习惯用法列表
unstack
要在列索引中的级别。groupby
具有更直观的API。对许多人来说,这是首选的方法。是开发人员的预期方法。groupby
范例类似,我们指定最终将成为行或列级别的所有列,并将这些列设置为索引。然后unstack
列中所需的级别。如果剩余的索引级别或列级别不唯一,则此方法将失败。set_index
非常相似,因为它共享重复密钥限制。API也非常有限。它只接受index
、columns
、values
的标量值。pivot_table
方法,我们选择要在其上进行透视的行、列和值。但是,我们不能聚合,如果行或列不是唯一的,则此方法将失败。pivot_table
的一个专门版本,以最纯粹的形式是执行多个任务的最直观的方式。实例
接下来的每个答案和问题我要做的是使用
pd.DataFrame.pivot_table
来回答。然后我将提供执行相同任务的替代方案。问题3
pd.DataFrame.pivot_table
fill_value
默认情况下未设置。我倾向于适当地设置它。在本例中,我将其设置为0
。注意,我跳过了问题2,因为它与此答案相同,没有fill_value
aggfunc='mean'
是默认值,我不需要设置它。我把它写得很清楚。pd.DataFrame.groupby
pd.crosstab
问题4
pd.DataFrame.pivot_table
pd.DataFrame.groupby
pd.crosstab
问题5
注意,对于
pivot_table
和crosstab
,我需要传递可调用的列表。另一方面,groupby.agg
能够为有限数量的特殊函数获取字符串。groupby.agg
也会使用我们传递给其他人的相同的可调用函数,但它通常更为有效ficient可以利用字符串函数名来提高效率。pd.DataFrame.pivot_table
pd.DataFrame.groupby
pd.crosstab
问题6
pd.DataFrame.pivot_table
我们通过了values=['val0', 'val1']
但是我们可以完全忽略它pd.DataFrame.groupby
问题7
pd.DataFrame.pivot_table
pd.DataFrame.groupby
问题8
pd.DataFrame.pivot_table
pd.DataFrame.groupby
pd.DataFrame.set_index
因为键集对于行和列都是唯一的问题9
pd.DataFrame.pivot_table
pd.DataFrame.groupby
pd.crosstab
pd.factorize
+np.bincount
pd.get_dummies
问题10
第一步是为每一行指定一个数字-这个数字将是数据透视结果中该值的行索引。这是使用^{} 完成的:
第二步是使用新创建的列作为调用^{} 的索引。
问题11
如果
columns
使用字符串join
键入object
否则
format
相关问题 更多 >
编程相关推荐