在循环中分配给数据框

时间:2020-07-10 13:40:13

标签: python pandas

我想编写一个接受数据框并删除其某些行的函数:

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的副本吗?如果是这样,我该如何重写代码以访问函数中的真实数据框?更笼统地说,我想对函数中的数据帧执行其他各种操作,这些操作需要更新作为函数输入输入传递的对象,所以有通用的解决方案吗?

2 个答案:

答案 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本身。 此方法有效,但不建议这样做,因为在代码中有globalseval(更多信息,原因:Why is Global State so Evil?

简单的方法是:

def f(df):
    return df[(df > 2)]

a = f(a)

函数返回刚刚更改的数据框。