Python 在Pandas中使用lambda函数后,索引列消失

Python 在Pandas中使用lambda函数后,索引列消失,python,pandas,dataframe,lambda,Python,Pandas,Dataframe,Lambda,我想计算某个对象在一小时(“时间”)内的百分比,所以我尝试编写一个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() 在该代码之

我想计算某个对象在一小时(“时间”)内的百分比,所以我尝试编写一个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')
如果有需要,我将写一些表格,每个列都有值。
提前谢谢

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
df = df.set_index(['id', 'name'])
df[['col1', 'col2']] = df[['col1', 'col2']].apply(lambda x: x * 100 / 3600)
如果您希望将索引设置为多列,并且希望使用
pd.DataFrame.apply
,这可以分为两个单独的步骤。例如:

# 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
df = df.set_index(['id', 'name'])
df[['col1', 'col2']] = df[['col1', 'col2']].apply(lambda x: x * 100 / 3600)

您可以应用重置索引的
.reset\u index()
。查看
pandas
文档,您将看到
.reset_index()
将索引传输到列。

向外移动循环将使代码运行速度显著加快:

for c in ['col1', 'col2', 'col3', 'col4', 'col5']:
    df[c] *= 100. / 3600
这是因为各个循环的计算将以矢量化的方式进行

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

来自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

请提供您正在使用的数据或样本,使我们能够对其进行测试。更快,您将获得+1