我有一个熊猫数据框,看起来像:
d = {'some_col' : ['A', 'B', 'C', 'D', 'E'],
'alert_status' : [1, 2, 0, 0, 5]}
df = pd.DataFrame(d)
Run Code Online (Sandbox Code Playgroud)
我的工作中有很多任务需要在熊猫中执行相同的任务。我开始写标准化的函数,这些函数将数据框作为参数并返回一些信息。这是一个简单的例子:
def alert_read_text(df, alert_status=None):
if (alert_status is None):
print 'Warning: A column name with the alerts must be specified'
alert_read_criteria = df[alert_status] >= 1
df[alert_status].loc[alert_read_criteria] = 1
alert_status_dict = {0 : 'Not Read',
1 : 'Read'}
df[alert_status] = df[alert_status].map(alert_status_dict)
return df[alert_status]
Run Code Online (Sandbox Code Playgroud)
我希望该函数返回一个序列。这样,可以在现有数据框中添加一列:
df['alert_status_text'] = alert_read_text(df, alert_status='alert_status')
Run Code Online (Sandbox Code Playgroud)
但是,当前,此函数将正确返回一个序列,但也会修改现有列。如何使传入的原始列不被修改?
正如您所发现的那样,传入的数据帧将随着通过引用传递的参数而被修改,这在python中是正确的,因此与大熊猫无关。
因此,如果您不想修改传递的df,请复制一份:
def alert_read_text(df, alert_status=None):
if (alert_status is None):
print 'Warning: A column name with the alerts must be specified'
copy = df.copy()
alert_read_criteria = copy[alert_status] >= 1
copy[alert_status].loc[alert_read_criteria] = 1
alert_status_dict = {0 : 'Not Read',
1 : 'Read'}
copy[alert_status] = copy[alert_status].map(alert_status_dict)
return copy[alert_status]
Run Code Online (Sandbox Code Playgroud)
另请参阅相关内容:pandas数据框,按值复制
| 归档时间: |
|
| 查看次数: |
7624 次 |
| 最近记录: |