类似于熊猫中的枢轴

时间:2019-08-12 21:39:31

标签: python excel pandas numpy pivot

我有一个愚蠢的问题,我似乎无法解决。我需要像这样采集一个熊猫数据框:

id     part1    part2   part3   part4   part5
23024   xyz9     23l    lk8     jkd9    298
48392   xyz10    24x    29x      ef3    298

现在,我只想“旋转”表,以便有两列显示ID和零件:

id    Parts
23024  xyz9
23024  23l
23024  lk8
23024  jkd9
23024  298
48392  xyz10
48392  29x
48392  ef3
48392  298

我首先获得了所有唯一的ID:

lst =[]
for i in df['id']:
   if i is not None:
      lst.append(i)

然后尝试了一些函数来获取值,但失败了:

    df_new = pd.DataFrame(columns=['id', 'parts'])
    for i in lst:
        temp_df = df.loc[df['id'] == i]
        for x in temp_df.columns:
            temp_list = []
            temp_list.append([str(i), str(temp_df[x][0])])
            temp_df = pd.DataFrame(temp_list, columns=['id', 'parts'])
            df = df.append(temp_df)

但是我一直收到KeyErrors。我在做什么错了?

2 个答案:

答案 0 :(得分:3)

因此,这里还有两个选项meltwide_to_long:我个人建议第二个选项,因为重塑后我们不会丢失任何信息,我们仍然拥有零件号

df.melt('id')
Out[167]: 
      id variable  value
0  23024    part1   xyz9
1  48392    part1  xyz10
2  23024    part2    23l
3  48392    part2    24x
4  23024    part3    lk8
5  48392    part3    29x
6  23024    part4   jkd9
7  48392    part4    ef3
8  23024    part5    298
9  48392    part5    298
pd.wide_to_long(df,['part'],i='id',j='number')
Out[168]: 
               part
id    number       
23024 1        xyz9
48392 1       xyz10
23024 2         23l
48392 2         24x
23024 3         lk8
48392 3         29x
23024 4        jkd9
48392 4         ef3
23024 5         298
48392 5         298

答案 1 :(得分:1)

另一种方法是将ARRAY设置为索引并堆叠其余的列:

'id'

如果需要,您可以选择要保留的重要列:

df_new = df.set_index('id').stack().reset_index()

输出:

df_new[['id', 0]].rename(columns={0: 'Parts'})