gpt4 book ai didi

python Pandas 枢轴: How to do a proper tidyr-like spread?

转载 作者:行者123 更新时间:2023-11-28 17:14:25 25 4
gpt4 key购买 nike

我缺少在 Python 中从长到宽自发和简单的转换,反之亦然。想象一下,我有一个大型整洁的数据框,其中包含许多属性列和一个包含所有实际值的列,例如

PropA ... PropZ    Value
green Saturn 400
green Venus 3
red Venus 2
.
.

通过保持数据整洁,数据本身得到了很好的处理。但有时我必须对某些属性执行一些操作(例如,比较蜂红色和蜂绿色(对于所有与其他属性相似的项目)可能很有趣)。因此,直接的方法是尽可能保持整洁,并且只整理我感兴趣的某些属性(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 affected
indcols = list(df.columns)
indcols.remove(propcol)
indcols.remove(valcol)

tmpdf=pd.DataFrame()
for key, group in df.groupby(indcols):
dc1 = {a:[b] for (a,b) in zip(indcols,key)}
dc2 = flip(group,propcol,valcol)
tmpdf = pd.concat([tmpdf,pd.concat([pd.DataFrame(dc1),pd.DataFrame(dc2)],axis=1)])

return tmpdf.reset_index(drop = True)

最佳答案

在提示的帮助下,我创建了一个更简单的版本。我对索引机制仍然有点困惑,但时间会帮助我更好地理解。

def spread(df, propcol, valcol):
indcol = list(df.columns.drop(valcol))
df = df.set_index(indcol).unstack(propcol).reset_index()
df.columns = [i[1] if i[0] == valcol else i[0] for i in df.columns]
return df

关于 python Pandas 枢轴: How to do a proper tidyr-like spread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45220904/

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