Python def语句创建一个新列-1
在def语句中,我想知道为什么创建的列不写入数据集Python def语句创建一个新列-1,python,pandas,Python,Pandas,在def语句中,我想知道为什么创建的列不写入数据集 def MA(df, n): MA = pd.Series(pd.rolling_mean(df['Close'], n), name = 'MA_' + str(n)) df = df.join(MA) 当我调用函数时 MA(df,10) 为什么不先将MA列写入“df”中,将变量MA的名称定义为与函数名MA完全相同是非常糟糕的做法 第二,向数据帧添加列可以通过简单的 df['new_col_name'] = c
def MA(df, n):
MA = pd.Series(pd.rolling_mean(df['Close'], n), name = 'MA_' + str(n))
df = df.join(MA)
当我调用函数时
MA(df,10)
为什么不先将MA列写入“df”中,将变量
MA
的名称定义为与函数名MA
完全相同是非常糟糕的做法
第二,向数据帧添加列可以通过简单的
df['new_col_name'] = col
索引将自动对齐,未找到的索引将填充null
针对@Abdou的评论:
def assign(df):
df['test'] = pd.Series(range(4))
将使用四个元素向
df
添加一列新的'test'
。根据需要修改它。这不是问题。。。嗯,不是真的。这是关于Python和范围的 发生了什么事?
def MA(df, n):
MA = pd.Series(pd.rolling_mean(df['Close'], n), name = 'MA_' + str(n))
df = df.join(MA)
- @麦是对的!永远不要将变量命名为Python中调用它的函数的名称。我知道其他语言也会这样做。不是用Python!也就是说,没什么大不了的,我们可以改变它,但我们仍然必须处理手头的问题
- 一旦您将
的结果分配给一个名称join
,该df
就变成了一个新的df
,完全在函数范围内。我假设您希望在函数范围之外增加df
df
不推荐1
使用
pd.DataFrame.insert
将新列放置到现有的DataFrame对象中(也称为就地)。我不建议这样做,因为我不喜欢修改正在修改它的函数范围之外的对象
def MA(df, n):
not_MA = df['Close'].rolling(n).mean().rename('MA_{}'.format(n))
df.insert(df.shape[1], not_MA.name, not_MA)
不推荐2
见@Mai的答案
我的建议
执行您正在执行的操作,但返回结果
def MA(df, n):
not_MA = df['Close'].rolling(n).mean().rename('MA_{}'.format(n))
return df.join(not_MA)
但是在适当的范围内重新分配它
df = MA(df, 2)
因为更改不是通过引用完成的。在函数内部生成一个新的数据帧。您需要返回它。@Abdou Python对象(元组和原语等不可变对象除外)是通过引用传递的。事实上,我将向您展示一个函数,该函数将修改
df
的内容而不返回。@Mai,您的语句的第一部分是正确的,但这里并不是这样。用户实际上正在函数定义中创建一个新的数据帧。他们正在用df.join(MA)
重置df
。这将创建一个需要返回的新数据帧。这不同于只向数据框添加列。在这种情况下,更改不是通过引用完成的。@Abdou我现在明白你的意思了。这是因为df
内部MA
函数的指针值与df
外部MA
函数的指针值不同。即使df
insideMA
指向新的数据帧,它也不会影响指针df
externalMA
。它不是将指向的源对象的内容复制到指向的目标对象的内容,而是简单地将保存指针值的局部变量替换为引用新数据帧的另一个指针值。这正是因为更改是通过引用完成的,所以它不起作用。但是是的,它不会起作用。但是没有,都是通过参考来完成的。回答得好。