我见过很多关于数据透视表的问题.即使他们不知道他们询问数据透视表,他们通常也是.几乎不可能写出一个规范的问题和答案,其中包含了旋转的所有方面....
......但是我要试一试.
现有问题和答案的问题在于,问题通常集中在OP难以概括以便使用一些现有的良好答案的细微差别.但是,没有一个答案试图给出全面的解释(因为这是一项艰巨的任务)
从我的谷歌搜索中查看一些示例
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 …Run Code Online (Sandbox Code Playgroud) 我在 Python 中缺少从长到宽的自发和轻松转换,反之亦然。想象一下,我有一个大而整洁的数据框,其中包含许多属性列和一个包含所有实际值的列,例如
PropA ... PropZ Value
green Saturn 400
green Venus 3
red Venus 2
.
.
Run Code Online (Sandbox Code Playgroud)
数据本身通过保持整洁而得到很好的处理。但有时我必须对某些属性执行一些操作(例如,比较蜜蜂红色和绿色蜜蜂(对于与其他属性相似的所有项目)可能很有趣)。因此,直接的方法是尽可能保持整洁,只弄乱我感兴趣的某些属性(PropA)。随后,我可以使用我想要的任何函数执行逐行映射,并且我可以创建一个包含函数输出的附加 PropA-Entry。
然而,在 Python 中保持所有其他属性的整洁并不像我习惯使用 R 时那么容易。原因是,所有非关键属性都通过我找到的所有 pd 方法提交给索引。如果我想保留更多的专栏,那就一团糟。
那么你如何处理这个问题。有没有其他巧妙的方法来处理这些类型的问题?
我自己写了一个传播方法,但它非常慢。也许,你对我如何改进有一些想法。
#the idea is to group by the remaining properties, which should be left in the long format.
#then i spread the small tidy data table for any group
@staticmethod
def spread(df, propcol, valcol):
def flip(data,pc,vc):
data = data.reset_index(drop=True)
return {data[pc][i]:[data[vc][i]] for i in range(0,len(data))}
#index columns are all which are not …Run Code Online (Sandbox Code Playgroud) 我读过熊猫:如何使用多索引运行数据透视?但这不能解决我的问题。
给定以下数据框:
import pandas as pd
df = pd.DataFrame({
"date": ["20180920"] * 6,
"id": ["A123456789"] * 6,
"test": ["a", "b", "c", "d", "e", "f"],
"result": [70, 90, 110, "(-)", "(+)", 0.3],
"ref": ["< 90", "70 - 100", "100 - 120", "(-)", "(-)", "< 1"]
})
Run Code Online (Sandbox Code Playgroud)
我想散布该test列,使用中的值result,然后忽略ref。换句话说,所需的输出如下:
date id a b c d e f
0 20180920 A123456789 70 90 110 (-) (+) 0.3
Run Code Online (Sandbox Code Playgroud)
因此,我尝试了一下df.pivot(index=["date", "id"], columns="test", values="result"),但由于ValueError失败:传递的值的长度为6,索引隐含2 …