鱼C论坛

 找回密码
 立即注册
查看: 1361|回复: 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]再操作求余。
import numpy as np
import pandas as pd

A = np.random.randint(0,100,100)
df = pd.DataFrame(A,columns=['a'])
df
'''
        a
0        41
1        79
2        49
3        2
4        51
...        ...
95        68
96        5
97        12
98        43
99        23
100 rows × 1 columns
'''


def calc(x):
    return x % 10
ex = df['a'].apply(calc)
ex
'''
0     1
1     9
2     9
3     2
4     1
     ..
95    8
96    5
97    2
98    3
99    3
Name: a, Length: 100, dtype: int64
'''
最佳答案
2021-9-6 19:52:33
本帖最后由 louxinghao 于 2021-9-6 22:33 编辑
flyps 发表于 2021-9-6 21:34
我觉得我已经描述的很清楚了


看明白了
import numpy as np
import pandas as pd

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

n = 0
def calc(x):
    global n
    if x != n:
        return None
    r = df.loc[x].a % 10
    n = x + r + 1
    return r

# 返回 nan 的就是不计算的
df['b'] = df.index.map(calc)

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


看明白了
import numpy as np
import pandas as pd

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

n = 0
def calc(x):
    global n
    if x != n:
        return None
    r = df.loc[x].a % 10
    n = x + r + 1
    return r

# 返回 nan 的就是不计算的
df['b'] = df.index.map(calc)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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


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


if __name__ == "__main__":
    A = np.random.randint(0, 100, 100)
    df = pd.DataFrame(A, columns=['a'])
    test(df)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-6 20:48:59 | 显示全部楼层
为什么跳过 9 之后就变成 12 再操作了,没明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

谢谢,不过使用while循环,速度太慢,因为实际要操作的DataFrmae的行数可能有上百万行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

我觉得我已经描述的很清楚了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-7 00:15:45 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

所以你想用啥?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

你想要的时效是多久呢,上百万行一个循环也没多久啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

In [9]: df.a.apply(lambda x: x if x%10 == 1 else x%10)   # 余数为1,则保持原值;余数不为1,则计算它对10的余数。
Out[9]: 
0     0
1    21
2     3
3    41
4     5
Name: a, dtype: int64
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-8 12:49:12 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 08:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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