def语句创建一个新列 - 熊猫

时间:2017-11-22 04:13:39

标签: 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”

2 个答案:

答案 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)  
  • @Mai是对的!不要将变量命名为与在Python中调用它的函数相同的东西。我知道其他语言都这样做。不是在Python中!也就是说,没什么大不了的,我们可以改变它,我们仍然需要处理手头的问题。
  • 只要您将join的结果分配给名称dfdf就会完全成为 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)