我想编写一个接受数据框并删除其某些行的函数:
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
的副本吗?如果是这样,我该如何重写代码以访问函数中的真实数据框?更笼统地说,我想对函数中的数据帧执行其他各种操作,这些操作需要更新作为函数输入输入传递的对象,所以有通用的解决方案吗?
答案 0 :(得分:0)
这是我真正想问的:Pandas best way to subset a dataframe inplace, using a mask
如何进行过滤。
所以在您的情况下(我认为):
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)
答案 1 :(得分:0)
您还可以修改全局变量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”,而不是变量a
本身。
此方法有效,但不建议这样做,因为在代码中有globals
和eval
(更多信息,原因:Why is Global State so Evil?)
简单的方法是:
def f(df):
return df[(df > 2)]
a = f(a)
函数返回刚刚更改的数据框。