python - 熊猫分配和复制
问题描述
如果我们运行以下代码,
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
复制第二个代码中的?谢谢
解决方案
对于第一个功能:
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
希望这能回答你的问题。
推荐阅读
- ibm-midrange - 如何将 AS400 .mac 宏转换为 PCOMM (vbs) 宏?
- ecmascript-6 - 具有函数和使用“this”的 es6 变量
- javascript - 如何在 React 中将 DialogContentText 内容复制到剪贴板?
- javascript - 对象未推入本地存储阵列
- java - 我想将一些物品发送到第二个活动的回收站视图。我怎么能用房间做到这一点
- angular - 如何测试部署在云上的 Angular SPA
- linux - 通过 ssh 连接使用的脚本不执行命令。如果直接在 ssh 机器上执行,它会执行
- amazon-web-services - EC2 实例的 AWS 服务发现?
- php - 为什么我需要 Docker for Laravel?
- docker - 有人可以解释什么是 Kafka Listener