Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧删除列再次出现_Python_Pandas - Fatal编程技术网

Python 数据帧删除列再次出现

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

抱歉,如果我做了一些愚蠢的事情,但我对这个问题感到非常困惑:我将一个数据帧传递给一个函数,然后在该函数中添加一列并删除它。在此之前没有什么奇怪的,但是在函数完成后,全局名称范围的数据帧将显示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
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
。非常感谢您的链接和解释!都很简洁而且很清楚。