【问题标题】:Index columns disappeared after lambda function in PandasPandas 中的 lambda 函数后索引列消失
【发布时间】:2018-05-11 13:14:43
【问题描述】:

我想计算一小时内某个对象的百分比(“时间”),所以我尝试编写一个 lambda 函数,我认为它可以完成这项工作,但索引列消失了,数据框分组的列。

df = df.groupby(['id', 'name', 'time', 'object', 'type'], as_index=True, sort=False)['col1', 'col2', 'col3', 'col4', 'col5'].apply(lambda x: x * 100 / 3600).reset_index()

在该代码之后,我打印 df.columns 并得到:

Index([u'index', u'col1', col2', u'col3',
       u'col4', u'col5'],
      dtype='object')

如果需要,我将编写一些表格,其中包含每列的值。 提前致谢。

【问题讨论】:

  • 请提供您正在使用的数据或数据样本,以便我们对其进行测试。

标签: python pandas dataframe lambda


【解决方案1】:

将循环向外移动,将使代码运行得更快:

for c in ['col1', 'col2', 'col3', 'col4', 'col5']:
    df[c] *= 100. / 3600

这是因为各个循环的计算将以矢量化方式完成。

这也不会以任何方式修改索引。

【讨论】:

    【解决方案2】:

    pd.DataFrame.groupby 用于聚合数据,而不是将函数应用于多个列。

    对于简单的函数,您应该寻找矢量化解决方案。例如:

    # set up simple dataframe
    df = pd.DataFrame({'id': [1, 2, 1], 'name': ['A', 'B', 'A'],
                       'col1': [5, 6, 8], 'col2': [9, 4, 5]})
    
    # apply logic in a vectorised way on multiple columns
    df[['col1', 'col2']] = df[['col1', 'col2']].values * 100 / 3600
    

    如果您希望将索引设置为多列,并且热衷于使用pd.DataFrame.apply,这可以作为两个单独的步骤进行。例如:

    df = df.set_index(['id', 'name'])
    df[['col1', 'col2']] = df[['col1', 'col2']].apply(lambda x: x * 100 / 3600)
    

    【讨论】:

    • 快点,你得到了 +1
    【解决方案3】:

    您应用.reset_index() 重置索引。查看pandas 文档,您会看到.reset_index() 将索引传输到列。

    【讨论】:

      【解决方案4】:

      来自 Jpp 的数据

      df[['col1','col2']]*=100/3600
      df
      Out[110]: 
             col1      col2  id name
      0  0.138889  0.250000   1    A
      1  0.166667  0.111111   2    B
      2  0.222222  0.138889   1    A
      

      【讨论】:

        猜你喜欢
        • 2021-09-20
        • 2013-11-15
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 1970-01-01
        相关资源
        最近更新 更多