【问题标题】:Change table to tall format using panda (UNPIVOT)使用熊猫(UNPIVOT)将表格更改为高格式
【发布时间】:2017-04-14 19:12:25
【问题描述】:

我有一张这样的桌子

   user         company company2 company3 company4
    1           Mac     Lenovo    Hp      null              
    2           Mac       MSI     Sony                          

我希望使用 pandas

     user    company
     1          Mac
     1          Lenovo
     1          Hp
     2         Mac

等等 在这里我尝试了,但没有使用 pandas pivot。

dataframe = pd.read_csv('data.csv')
dataframe.fillna(value='', inplace=True)
#dataframe.pivot(index='user', columns='company')

以上代码不起作用并给出错误。

【问题讨论】:

  • “它不起作用”并不是特别具体。请包含您看到的确切错误消息。
  • @Metropolis 我在想这个错误非常愚蠢,所以我想使用它。抱歉下次会尽力而为
  • 您可以编辑您的问题并包含错误消息。确切的错误通常对帮助调试问题很有帮助。

标签: python pandas dataframe unpivot


【解决方案1】:

你可以使用pd.melt方法:

In [211]: pd.melt(df, id_vars='user', value_vars=df.columns.drop('user').tolist())
Out[211]:
   user  variable   value
0     1   company     Mac
1     2   company     Mac
2     1  company2  Lenovo
3     2  company2     MSI
4     1  company3      Hp
5     2  company3    Sony
6     1  company4    null
7     2  company4     NaN

In [213]: pd.melt(df,
                  id_vars='user', value_vars=df.columns.drop('user').tolist(),
                  value_name='Company') \
            .drop('variable',1)
Out[213]:
   user Company
0     1     Mac
1     2     Mac
2     1  Lenovo
3     2     MSI
4     1      Hp
5     2    Sony
6     1    null
7     2     NaN

更新:删除 NaN 并按 user 排序生成的 DF:

In [218]: pd.melt(df,
     ...:         id_vars='user', value_vars=df.columns.drop('user').tolist(),
     ...:         value_name='Company') \
     ...:   .drop('variable',1) \
     ...:   .dropna() \
     ...:   .sort_values('user')
     ...:
Out[218]:
   user Company
0     1     Mac
2     1  Lenovo
4     1      Hp
6     1    null
1     2     Mac
3     2     MSI
5     2    Sony

PS 如果你想摆脱 null 值 - 使用 df.replace('null', np.nan) 而不是 df

In [219]: pd.melt(df.replace('null', np.nan),
     ...:         id_vars='user', value_vars=df.columns.drop('user').tolist(),
     ...:         value_name='Company') \
     ...:   .drop('variable',1) \
     ...:   .dropna() \
     ...:   .sort_values('user')
     ...:
Out[219]:
   user Company
0     1     Mac
2     1  Lenovo
4     1      Hp
1     2     Mac
3     2     MSI
5     2    Sony

【讨论】:

  • @Aurora,你能说得更具体些吗?
  • 对不起,嗯,没有任何变化,表格是一样的
  • 我正在尝试使用您的第二个示例,第一个有效
  • @Aurora,试试这个:result = pd.melt(...)
  • 是的,完全一样!现在好了!很抱歉给我带来了麻烦,但你帮我学到了新东西^_^
【解决方案2】:

可以用stack来代替(不知道是不是比melt效率更高:

dataframe.set_index("user").stack().reset_index(-1, drop=True)

user
1       Mac
1    Lenovo
1        Hp
2       MSI
2       Mac
2      Sony

堆栈本质上将列推送为索引的一部分(并创建MultiIndex)-因此,对于每个列-行组合,您都会在新的DataFrame 中获得一行。即DataFrame

   C1 C2
0  A  B
1  a  b

stack() 之后变成Series

0  C1 A
0  C2 B
1  C1 a
1  C2 b

【讨论】:

  • 我试过了,但 dint 实际上工作正常,请您按照我的示例编辑答案,太好了!
  • 我认为user 是您的索引。试试上面的版本(我加了set_index("user")
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 2022-10-15
相关资源
最近更新 更多