gpt4 book ai didi

python - reshape pandas DataFrame Python 3.x

转载 作者:太空宇宙 更新时间:2023-11-03 14:43:12 25 4
gpt4 key购买 nike

我有一只像这样的 Pandas :

df =
cid pid purl tid turl sid surl
c1 p1 urlp1 t1 urlt1 s1 urls1
c1 p1 urlp1 t1 urlt1 s2 urls2
c1 p1 urlp1 t1 urlt1 s3 urls3
c2 p2 urlp2 t2 urlt2 s5 urls5
c2 p2 urlp2 t2 urlt2 s6 urls6

我想要的是这样的结果:

cid     uid      url
c1 p1 urlp1
c1 t1 urlt1
c1 s1 urls1
c1 s2 urls2
c1 s3 urls3
c2 p2 urlp2
c2 t2 urlt2
c2 s5 urls5
c2 s6 urls6

我尝试使用 pd.melt 来实现这一点,但我只能部分地这样做:

df2 = pd.melt(df, id_vars = 'cid', value_vars = ['pid','tid','purl'], value_name = 'userid')

如何获取更多列? value_name 需要更多列吗?我怎样才能做到这一点?

最佳答案

一种手动​​解决方案是使用列表理解。步骤是:

  1. 将索引设置为键列 cid
  2. 根据列数计算列表理解循环的长度。
  3. concat 与您的数据框列表一起使用,并通过 pipe 重命名列 [如果需要,添加其他格式]。
  4. 最后,reset_index(将索引提升为一个系列)和drop_duplicates

这是一个演示:

df = df.set_index('cid')

def formatter(df):
df.columns = ['uid', 'url']
return df

n = int(len(df.columns) / 2)
L = [df.iloc[:, 2*i:2*(i+1)].pipe(formatter) for i in range(n)]
res = pd.concat(L, axis=0).reset_index().drop_duplicates()

print(res)

cid uid url
0 c1 p1 urlp1
3 c2 p2 urlp2
5 c1 t1 urlt1
8 c2 t2 urlt2
10 c1 s1 urls1
11 c1 s2 urls2
12 c1 s3 urls3
13 c2 s5 urls5
14 c2 s6 urls6

关于python - reshape pandas DataFrame Python 3.x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51722864/

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