【问题标题】:Similar to a Pivot in Pandas类似于 Pandas 中的 Pivot
【发布时间】:2019-12-19 11:16:36
【问题描述】:

我有一个似乎无法解决的愚蠢问题。我需要像这样使用 pandas 数据框:

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。我做错了什么?

【问题讨论】:

  • df.melt('id')?

标签: python excel pandas numpy pivot


【解决方案1】:

另一种方法是将'id'设置为索引并堆叠剩余的列:

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

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

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

输出:

      id  Parts
0  23024   xyz9
1  23024    23l
2  23024    lk8
3  23024   jkd9
4  23024    298
5  48392  xyz10
6  48392    24x
7  48392    29x
8  48392    ef3
9  48392    298

【讨论】:

    【解决方案2】:

    所以这里还有两个选项meltwide_to_long:我个人推荐第二个,因为我们在 reshape 后不会丢失任何信息,我们仍然有零件号

    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
    

    【讨论】:

    • 整洁!谢谢
    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多