Python 数据帧删除列再次出现
抱歉,如果我做了一些愚蠢的事情,但我对这个问题感到非常困惑:我将一个数据帧传递给一个函数,然后在该函数中添加一列并删除它。在此之前没有什么奇怪的,但是在函数完成后,全局名称范围的数据帧将显示added&drop列。如果我将DF声明为全局,则不会发生这种情况 此测试代码显示了由Python 3.3.3/2.7.6和pandas 0.13.0/0.12.0组合而成的四种情况下的问题:Python 数据帧删除列再次出现,python,pandas,Python,Pandas,抱歉,如果我做了一些愚蠢的事情,但我对这个问题感到非常困惑:我将一个数据帧传递给一个函数,然后在该函数中添加一列并删除它。在此之前没有什么奇怪的,但是在函数完成后,全局名称范围的数据帧将显示added&drop列。如果我将DF声明为全局,则不会发生这种情况 此测试代码显示了由Python 3.3.3/2.7.6和pandas 0.13.0/0.12.0组合而成的四种情况下的问题: #!/usr/bin/python import pandas as pd # FUNCTION DFcorr d
#!/usr/bin/python
import pandas as pd
# FUNCTION DFcorr
def DFcorr(df):
# Calculate column of accumulated elements
df['SUM']=df.sum(axis=1)
print('DFcorr: DataFrame after add column:')
print(df)
# Drop column of accumulated elements
df=df.drop('SUM',axis=1)
print('DFcorr: DataFrame after drop column:')
print(df)
# FUNCTION globalDFcorr
def globalDFcorr():
global C
# Calculate column of accumulated elements
C['SUM']=C.sum(axis=1)
print('globalDFcorr: DataFrame after add column:')
print(C)
# Drop column of accumulated elements
print('globalDFcorr: DataFrame after drop column:')
C=C.drop('SUM',axis=1)
print(C)
######################### MAIN #############################
C = pd.DataFrame.from_items([('A', [1, 2]), ('B', [3 ,4])], orient='index', columns['one', 'two'])
print('\nMAIN: Initial DataFrame:')
print(C)
DFcorr(C)
print('MAIN: DataFrame after call to DFcorr')
print(C)
C = pd.DataFrame.from_items([('A', [1, 2]), ('B', [3 ,4])], orient='index', columns=['one', 'two'])
print('\nMAIN: Initial DataFrame:')
print(C)
globalDFcorr()
print('MAIN: DataFrame after call to globalDFcorr')
print(C)
这里是输出:
MAIN: Initial DataFrame:
one two
A 1 2
B 3 4
[2 rows x 2 columns]
DFcorr: DataFrame after add column:
one two SUM
A 1 2 3
B 3 4 7
[2 rows x 3 columns]
DFcorr: DataFrame after drop column:
one two
A 1 2
B 3 4
[2 rows x 2 columns]
MAIN: DataFrame after call to DFcorr
one two SUM
A 1 2 3
B 3 4 7
[2 rows x 3 columns]
MAIN: Initial DataFrame:
one two
A 1 2
B 3 4
[2 rows x 2 columns]
globalDFcorr: DataFrame after add column:
one two SUM
A 1 2 3
B 3 4 7
[2 rows x 3 columns]
globalDFcorr: DataFrame after drop column:
one two
A 1 2
B 3 4
[2 rows x 2 columns]
MAIN: DataFrame after call to globalDFcorr
one two
A 1 2
B 3 4
[2 rows x 2 columns]
我错过了什么?非常感谢 注意
DFCorr
中的这一行:
df=df.drop('SUM',axis=1)
df.drop方法返回一个新的数据帧。它不会改变原始的df
在DFcorr
内部,df
只是一个局部变量。对df
的赋值不会影响全局变量C
。只有df
突变才会影响C
因此,您可以通过将该行更改为:
df.drop('SUM',axis=1, inplace=True)
请注意
DFCorr
中的这一行:
df=df.drop('SUM',axis=1)
df.drop方法返回一个新的数据帧。它不会改变原始的df
在DFcorr
内部,df
只是一个局部变量。对df
的赋值不会影响全局变量C
。只有df
突变才会影响C
因此,您可以通过将该行更改为:
df.drop('SUM',axis=1, inplace=True)
谢谢你的回复。那么我是否应该理解,当在函数作用域中使用数据帧标识符时(
df
,在本例中),它可以任意引用全局变量或局部变量?我的意思是,从答案来看,我应该理解在df['SUM']=df.SUM(axis=1)
中,df
在df=df.drop('SUM',axis=1)
和print(df)中影响全局变量吗
df引用的是局部变量?我在这里给出我的推理,以便您可以检查我是否正确理解了您的答案:如果我将df看作是一个C/C++指针,那么在调用函数的开头,它指向全局范围内的数据帧(这里是C
),并且在执行df['SUM']=df.SUM时(轴=1)
这是指C
,但在执行df=df.drop('SUM',轴=1)时
,那么,df
将指向函数本地的一个新数据帧。这个推理正确吗?非常感谢。@khyox:是的,我想你已经知道了!下面是对Python函数调用范例的解释。在后台,Python将df['SUM']=…
转换为对df的调用。u setitem_u('SUM',…)
变异的df
。因此df
一直指向C
指向的同一个对象。但是df=…
重新指定df
指向一个新对象,因此df
的进一步变异将不再影响C
。非常感谢您的链接和解释!都很简洁很清楚。谢谢你的回答。那么我应该理解当在函数范围中使用数据帧标识符时(df
,在本例中),它可以任意引用全局变量或局部变量吗?我的意思是,从回答中,我应该理解在df['SUM']=df.SUM(axis=1)
df在df=df.drop('SUM',axis=1)和print(df)中影响全局变量
df
引用的是局部变量?我在这里给出我的推理,以便您可以检查我是否正确理解了您的答案:如果我将df看作是一个C/C++指针,那么在调用函数的开头,它指向全局范围内的数据帧(这里是C
),并且在执行df['SUM']=df.SUM时(轴=1)
这是指C
,但在执行df=df.drop('SUM',轴=1)时
,那么,df
将指向函数本地的一个新数据帧。这个推理正确吗?非常感谢。@khyox:是的,我想你已经知道了!下面是对Python函数调用范例的解释。在后台,Python将df['SUM']=…
转换为对df的调用。u setitem_u('SUM',…)
变异的df
。因此df
一直指向C
指向的同一个对象。但是df=…
重新指定df
指向一个新对象,因此df
的进一步变异将不再影响C
。非常感谢您的链接和解释!都很简洁而且很清楚。