Python 使用pandas重新分配项目会产生错误的结果

Python 使用pandas重新分配项目会产生错误的结果,python,pandas,Python,Pandas,我正在修改列“x”的值,从而产生不同的数据帧,如图所示。我发现,当所有四个数据帧都应该相同时,重新分配会导致荒谬的值 下面是代码的外观 import pandas as pd def modifyspec(df,i,val=0.25): df['x'][(df['z']>=9) & (df['z']<=19)] = (df['x'][(df['z']>=9) & (df['z']<=19)] - (val))/(val) df.to_

我正在修改列“x”的值,从而产生不同的数据帧,如图所示。我发现,当所有四个数据帧都应该相同时,重新分配会导致荒谬的值

下面是代码的外观

import pandas as pd

def modifyspec(df,i,val=0.25):  
    df['x'][(df['z']>=9) & (df['z']<=19)] = (df['x'][(df['z']>=9) & (df['z']<=19)] - (val))/(val)
    df.to_csv('{}file.csv'.format(i),sep='\t',index=False)
    return


x=[1.1,1.2345,3.3456,4.4442,5.555,6.21234,7.3434]
y=[2.23,2.456,6.8899,9.222,10.999,13.1111,15.44545]
z=[5.44,6.99,8.99,11.33,13.33,19.002,28.445]
dfx=pd.DataFrame({'x': x,'y': y,'z':z})


for i in range(4):
    modifyspec(dfx,i,0.25)
将熊猫作为pd导入
def修改规格(df,i,val=0.25):

df['x'][(df['z']>=9)&(df['z']=9)&(df['z']]听起来您的问题是由于您的函数变异
df
,它是对函数范围外的数据帧的引用。若要解决此问题,请在函数内部创建一个副本,然后改为变异副本:

def modifyspec(df, prefix, val=0.25):
    df = df.copy()
    row_idx = (df['z'] >= 9) & (df['z'] <= 19)
    df.loc['x', row_idx] = (df.loc['x', row_idx] - val) / val
    df.to_csv(f'{prefix}file.csv', sep='\t', index=False)
def修改规范(df,前缀,val=0.25): df=df.copy()
row_idx=(df['z']>=9)和(df['z']你能把它改成使用
df.loc['x',…]
而不是
df['x'][…]
,它更标准,所以更容易遵循。我还建议分配
(df['z'>=9)和(df['z']您是否试图在每次循环迭代时修改
dfx
?如果不是,您可能希望包括
df=df.copy()
在函数的开头。Python正在将对
dfx
的引用传递给函数,因此当您在函数内部更改
df
时,实际上是在外部更改
dfx
,因为它是对同一对象的引用。如果您不想这样做,则需要在函数内部创建一个副本。另外,为什么您有JUt
return
?如果不返回任何内容,则不需要编写return。