在我的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”
答案 0 :(得分:1)
首先,定义变量MA
的名称与函数名MA
完全相同是非常糟糕的做法。
其次,只需
即可向数据框添加列df['new_col_name'] = col
指数将自动对齐,未完成的指数将填入null
。
回应@ Abdou的评论:
def assign(df):
df['test'] = pd.Series(range(4))
会向'test'
添加一个包含四个元素的df
新列。根据需要进行修改。
答案 1 :(得分:1)
这不是熊猫问题......实际上并非如此 这是关于Python和范围的。
发生了什么?
def MA(df, n):
MA = pd.Series(pd.rolling_mean(df['Close'], n), name = 'MA_' + str(n))
df = df.join(MA)
join
的结果分配给名称df
,df
就会完全成为新 df
功能范围。我假设您想要扩充函数范围之外的df
。 不推荐1
使用pd.DataFrame.insert
将新列放入现有数据框对象(也称为就地)。我不推荐这个,因为我不想修改正在修改它的函数范围之外的对象。
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)