在dataframe上迭代修改列值的最快方法

2024-09-21 01:17:13 发布

您现在位置:Python中文网/ 问答频道 /正文

Im使用一个csv文件,该文件在一列上有圈数,其中每一行包含关于该圈数的数据(最后一个数字是圈数),如下所示: 价值1,价值2,价值1 价值3、价值4、价值1 ... valueN,valuex,99

我有这个数据的一个子集,所以我有一个从lapX到lapY的范围,我想重新排列它,其中lapX是1,每次出现一个新圈时,将1添加到实际圈数。我编写的代码实现了我的目标:

csv = csv file readed as dataframe

lap = 1
lap_file = csv['Trial'][0]

while i < len(csv):
   if csv['Lap'][i] == lap_file:
   csv['Lap'][i] = lap
   i += 1
else:
   lap_file = csv['Lap'][i]
   lap = lap + 1
   csv['Lap'][i] = lap
   i += 1

代码做了我所需要的,但它需要很多时间,我想是因为它在每一行上迭代,而且文件有点大。那么,我想知道,有没有其他方法可以做到这一点

编辑:我的df示例

我所拥有的:

比赛1:

^{tb1}$

我想要的是,以更快的方式:

比赛1:

^{tb2}$

这是一个参考,有更多的行,我有多个比赛,所以我可以有一个比赛2,其中每圈的数据数量是不同的


Tags: 文件csv数据代码数字子集file价值
2条回答

基于预期的数据帧,看起来您只想递增地重新计算圈数,即使它们不是连续圈数。所以5,6,9变成了1,2,3

为此,获取Lap的唯一值并对其进行排序。然后用一个^{}来压缩它,它只是计数。从中创建一个字典,然后将旧搭接值映射到新搭接值:

import itertools

lap_map = dict(zip(sorted(df['Lap'].unique()), itertools.count(1)))
# lap_map is {5: 1, 6: 2, 9: 3}

df['Lap'] = df['Lap'].map(lap_map)
df

输出:

   value1 value2  Lap
id
1      a      b     1
2      c      d     1
3      e      f     2
4      g      h     2
5      i      j     3
6      k      l     3
7      m      n     3
  • 使用shift()生成lap更改时的二进制序列
  • cumsum()此序列(True等于1,False等于0)
  • 完全矢量化解
df = pd.DataFrame({'id': [1, 2, 3, 4, 5, 6, 7],
 'value1': ['a', 'c', 'e', 'g', 'i', 'k', 'm'],
 'value2': ['b', 'd', 'f', 'h', 'j', 'l', 'n'],
 'Lap': [5, 5, 6, 6, 9, 9, 9]})

df["Lap"] = (df["Lap"]!=df["Lap"].shift()).cumsum()

相关问题 更多 >

    热门问题