鱼C论坛

 找回密码
 立即注册
查看: 1775|回复: 10

[已解决]关于pandas的apply如何应用?谢谢

[复制链接]
发表于 2021-9-6 19:52:32 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 flyps 于 2021-9-6 19:55 编辑

下面的代码,是求得df中所有的,每个数字的余数,而我并不想求得所有号码的余数,我希望,如,df.loc[0]余数为1,就跳过1行不操作,到df.loc[2]再操作求余,df.loc[2]余数为9,则跳过9行不操作,到df.loc[12]再操作求余。
  1. import numpy as np
  2. import pandas as pd

  3. A = np.random.randint(0,100,100)
  4. df = pd.DataFrame(A,columns=['a'])
  5. df
  6. '''
  7.         a
  8. 0        41
  9. 1        79
  10. 2        49
  11. 3        2
  12. 4        51
  13. ...        ...
  14. 95        68
  15. 96        5
  16. 97        12
  17. 98        43
  18. 99        23
  19. 100 rows × 1 columns
  20. '''


  21. def calc(x):
  22.     return x % 10
  23. ex = df['a'].apply(calc)
  24. ex
  25. '''
  26. 0     1
  27. 1     9
  28. 2     9
  29. 3     2
  30. 4     1
  31.      ..
  32. 95    8
  33. 96    5
  34. 97    2
  35. 98    3
  36. 99    3
  37. Name: a, Length: 100, dtype: int64
  38. '''
复制代码

最佳答案
2021-9-6 19:52:33
本帖最后由 louxinghao 于 2021-9-6 22:33 编辑
flyps 发表于 2021-9-6 21:34
我觉得我已经描述的很清楚了


看明白了
  1. import numpy as np
  2. import pandas as pd

  3. A = np.random.randint(0,100,100)
  4. df = pd.DataFrame(A,columns=['a'])

  5. n = 0
  6. def calc(x):
  7.     global n
  8.     if x != n:
  9.         return None
  10.     r = df.loc[x].a % 10
  11.     n = x + r + 1
  12.     return r

  13. # 返回 nan 的就是不计算的
  14. df['b'] = df.index.map(calc)
复制代码

最佳答案

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-6 19:52:33 | 显示全部楼层    本楼为最佳答案   
本帖最后由 louxinghao 于 2021-9-6 22:33 编辑
flyps 发表于 2021-9-6 21:34
我觉得我已经描述的很清楚了


看明白了
  1. import numpy as np
  2. import pandas as pd

  3. A = np.random.randint(0,100,100)
  4. df = pd.DataFrame(A,columns=['a'])

  5. n = 0
  6. def calc(x):
  7.     global n
  8.     if x != n:
  9.         return None
  10.     r = df.loc[x].a % 10
  11.     n = x + r + 1
  12.     return r

  13. # 返回 nan 的就是不计算的
  14. df['b'] = df.index.map(calc)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-6 20:41:10 | 显示全部楼层
本帖最后由 suchocolate 于 2021-9-6 20:54 编辑

得自己写函数了
  1. import numpy as np
  2. import pandas as pd


  3. def test(df):
  4.     row = 0   # 初始行0
  5.     while row < 100:   # 行数大于99时结束函数
  6.         r = df['a'][row] % 10   # 当前元素除10的余数
  7.         print(r)
  8.         row += (r + 1)   # 余数+1就是下次要看的行


  9. if __name__ == "__main__":
  10.     A = np.random.randint(0, 100, 100)
  11.     df = pd.DataFrame(A, columns=['a'])
  12.     test(df)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-6 20:48:59 | 显示全部楼层
为什么跳过 9 之后就变成 12 再操作了,没明白
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-6 21:20:35 | 显示全部楼层

谢谢,不过使用while循环,速度太慢,因为实际要操作的DataFrmae的行数可能有上百万行
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-6 21:34:14 | 显示全部楼层
louxinghao 发表于 2021-9-6 20:48
为什么跳过 9 之后就变成 12 再操作了,没明白

我觉得我已经描述的很清楚了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-7 00:15:45 | 显示全部楼层
学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-7 09:55:18 | 显示全部楼层
flyps 发表于 2021-9-6 21:20
谢谢,不过使用while循环,速度太慢,因为实际要操作的DataFrmae的行数可能有上百万行

所以你想用啥?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-7 15:22:26 | 显示全部楼层
flyps 发表于 2021-9-6 21:20
谢谢,不过使用while循环,速度太慢,因为实际要操作的DataFrmae的行数可能有上百万行

你想要的时效是多久呢,上百万行一个循环也没多久啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-7 22:12:24 | 显示全部楼层
好像很简单的样子。。
  1. In [7]: df
  2. Out[7]:
  3.     a
  4. 0  10
  5. 1  21
  6. 2  33
  7. 3  41
  8. 4  55

  9. In [8]: df.a.apply(lambda x: x if x%10 == 1 else x**2)  # 余数为1,则保持原值;余数不为1,则求计算该值的平方
  10. Out[8]:
  11. 0     100
  12. 1      21
  13. 2    1089
  14. 3      41
  15. 4    3025
  16. Name: a, dtype: int64

  17. In [9]: df.a.apply(lambda x: x if x%10 == 1 else x%10)   # 余数为1,则保持原值;余数不为1,则计算它对10的余数。
  18. Out[9]:
  19. 0     0
  20. 1    21
  21. 2     3
  22. 3    41
  23. 4     5
  24. Name: a, dtype: int64
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-8 12:49:12 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-18 22:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表