我想在一小时内("时间"(计算某个对象的百分比,所以我尝试编写一个 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')
如果需要,我将编写一些包含每列值的表。 提前谢谢。
向外移动循环将使代码运行速度明显更快:
for c in ['col1', 'col2', 'col3', 'col4', 'col5']:
df[c] *= 100. / 3600
这是因为各个循环的计算将以矢量化的方式完成。
这也不会以任何方式修改索引。
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)
你应用.reset_index()
重置索引。查看pandas
文档,您会发现.reset_index()
将索引传输到列。
数据来自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