首页 > 解决方案 > 熊猫分配和复制

问题描述

如果我们运行以下代码,

def f(df):
    df = df.assign(b = 1)
    df["a"] = 1

df = pd.DataFrame(np.random.randn(100, 1))
f(df)
print(df)

我们得到

           0
0   1.298967
1  -0.887922
2   1.913559
3  -0.082032
4  -0.466594
..       ...
95 -0.845137
96  0.628542
97 -0.588897
98  0.464374
99  0.267946

然而,如果我们运行以下命令,

def f(df):
    df = df
    df["a"] = 1

df = pd.DataFrame(np.random.randn(100, 1))
f(df)
print(df)

我们得到

           0  a
0  -0.510875  1
1   0.401580  1
2  -0.037484  1
3  -0.935115  1
4  -1.108471  1
..       ... ..
95  0.362075  1
96 -1.017991  1
97  1.881081  1
98  0.376828  1
99  0.771661  1

我知道python中有一个通过对象引用传递的概念。为什么不df复制第二个代码中的?谢谢

标签: pythonpandasdataframe

解决方案


对于第一个功能:

def f(df):
    df = df.assign(b = 1)
    df["a"] = 1

df = pd.DataFrame(np.random.randn(100, 1))
f(df)
print(df) #doesnot return the changed columns

您正在将 input 更改为 input 的.copy()版本assign,从文档返回实际 dataframe 的副本:

返回一个包含所有原始列以及新列的新对象。重新分配的现有列将被覆盖。

要返回您在副本中所做的更改,您应该返回副本:

def f(df):
    df = df.assign(b = 1)
    df["a"] = 1
    return df

df = pd.DataFrame(np.random.randn(100, 1))
print(f(df))

相反,对于您的第二个函数,您在输入参数上分配了列 a,因此当您打印数据框时,您可以看到原始 df.

def f(df):
    df = df
    df["a"] = 1

df = pd.DataFrame(np.random.randn(100, 1))
f(df)
print(df)

要实现与第一个函数类似的行为,请尝试分配df = df.copy()

def f(df):
    df = df.copy()
    df["a"] = 1

df = pd.DataFrame(np.random.randn(100, 1))
f(df)
print(df) # doesnot return the a column

与我们对函数 1 所做的相同,您应该返回副本:

def f(df):
    df = df.copy()
    df["a"] = 1
    return df
df = pd.DataFrame(np.random.randn(100, 1))
print(f(df)) #returns the column a

希望这能回答你的问题。


推荐阅读