大熊猫数据帧和副作用的功能

时间:2014-07-15 20:41:57

标签: python function pandas

我想编写一个函数,它将Pandas数据帧作为输入,并返回平均值大于某个指定阈值的行。函数可以,但它有改变输入的副作用,我不想这样做。

def Remove_Low_Average(df, sample_names, average_threshold=30):
    data_frame = df
    data_frame['Mean'] = np.mean(data_frame[sample_names], axis=1)
    data_frame = data_frame[data_frame.Mean > 30]
    return data_frame.reset_index(drop=True)

示例:

In [7]: junk_data = DataFrame(np.random.randn(5,5), columns=['a', 'b', 'c', 'd', 'e'])
In [8]: Remove_Low_Average(junk_data, ['a', 'b', 'c'], average_threshold=0)
In [9]: junk_data.columns
Out[9]: Index([u'a', u'b', u'c', u'd', u'e', u'Mean'], dtype='object')

所以junk_data现在已经意味着'在其列中,即使从未在函数中分配。我意识到我可以用更简单的方式做到这一点,但这说明了我经常遇到的问题我无法弄清楚原因。我认为这必须是一个众所周知的事情,但我不知道如何让这种副作用停止发生。

编辑:EdChum的链接可以回答这个问题。

2 个答案:

答案 0 :(得分:0)

@EdChum在评论中回答了这个问题:

  

请参阅this page所以基本上如果你想避免修改原文,那么通过调用.copy()执行深层复制

答案 1 :(得分:0)

您不需要复制旧数据框,只是不要指定新列:)

def remove_low_average(df, sample_names, average_threshold=30):
    mean = df[sample_names].mean(axis=1)
    return df.ix[mean > average_threshold]

# then use it as:
df = remove_low_average(df, ['a', 'b'])