我想编写一个函数,它将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的链接可以回答这个问题。
答案 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'])