我想写一个函数,它接受一个数据帧并删除其中的一些行:
import pandas as pd
a = pd.DataFrame([1,2,3,3,5])
def f(df):
df = df[(df > 2)]
print(df)
f(a)
print(a)
此输出
0
2 3
3 3
4 5
0
0 1
1 2
2 3
3 3
4 5
因此此处未更新a
。这是因为函数体内的df实际上是a
的副本吗?如果是,我如何重写代码以访问函数中的真实数据帧?更普遍地说,我想对函数中的数据帧做其他各种事情,这些事情需要更新作为函数输入传递的对象,那么有没有通用的解决方案呢?
这就是你真正想要问的问题我认为:Pandas使用掩码在原地对数据帧进行子集划分的最佳方法
如何就地过滤。
所以在你的情况下,它会是(我认为(:
import pandas as pd
a = pd.DataFrame([1,2,3,3,5])
def f(df):
# df = df[(df > 2)]
df.drop(df[(df > 2)], inplace = True) # might need df[(df>2)].index
print(df)
f(a)
print(a)
您还可以修改全局变量a
:
import pandas as pd
a = pd.DataFrame([1,2,3,3,5])
def f(df_name):
globals()[df_name] = eval(f"{df_name}[({df_name} > 2)]")
print(globals()[df_name])
f("a")
现在,名为";a";将被修改。请注意,函数的参数是字符串";a";而不是变量CCD_ 4本身。这是有效的,但不推荐使用,因为代码中有globals
和eval
(阅读更多原因:为什么全球状态如此邪恶?(
简单的方法是:
def f(df):
return df[(df > 2)]
a = f(a)
函数返回刚刚更改的数据帧。