如何避免Python在变量被应用于多个部分后混淆代码?

2024-09-30 14:17:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个数据帧:

FamilyVsWWTotal = pd.DataFrame({'date':['2011-4-3','2011-3-5','2011-4-3','2011-5-7'], 'Country':['USA','CAN','USA','MEX']})

因此它将有以下输出:

date          Country
2011-4-3      USA
2011-3-5      CAN
2011-4-3      USA
2011-5-7      MEX

下面的代码是2创建的表1:

 Table1=FamilyVsWWTotal
 Table1['Region']='K'

因此,表1将有以下输出:

date          Country   Region
2011-4-3      USA       K
2011-3-5      CAN       K
2011-4-3      USA       K
2011-5-7      MEX       K

对于第二个表,即表2:

Table2=FamilyVsWWTotal
Table2['aveAge']=60

因此,表2的输出应该是这样的:

date          Country   aveAge
2011-4-3      USA       60
2011-3-5      CAN       60
2011-4-3      USA       60
2011-5-7      MEX       60

但我总是面临这样一个问题,即表2的输出将是这样的,它已经混淆了上面的代码:

表2

date          Country   Region   aveAge
2011-4-3      USA       K        60
2011-3-5      CAN       K        60
2011-4-3      USA       K        60
2011-5-7      MEX       K        60

任何人都能提出一些解决这个问题的办法吗


Tags: 数据代码dataframedatecountrycanregionpd
3条回答

执行Table1=FamilyVsWWTotal会导致浅拷贝。这两个变量链接到内存中的同一个DataFrame对象

您可以通过以下方式进行检查:

print(id(Table1))
print(id(FamilyVsWWTotal))


如果需要两个单独的数据帧,在其中可以进行单独的计算,则必须执行深度复制,如下所示:
Table1 = FamilyVsWWTotal.copy(deep=True)

由于deep=Truecopy()的默认值,您只需

Table1 = FamilyVsWWTotal.copy()

同样地

Table2 = FamilyVsWWTotal.copy(deep=True)


因此,您的代码应该如下所示:
FamilyVsWWTotal = pd.DataFrame({'date':['2011-4-3','2011-3-5','2011-4-3','2011-5-7'], 'Country':['USA','CAN','USA','MEX']})
Table1=FamilyVsWWTotal.copy()
Table1['Region']='K'
Table2=FamilyVsWWTotal.copy()
Table2['aveAge']=60

Use.assign返回一个新的数据帧

In [137]: Table1 = FamilyVsWWTotal.assign(Region='K')

In [138]: Table1
Out[138]:
  Country      date Region
0     USA  2011-4-3      K
1     CAN  2011-3-5      K
2     USA  2011-4-3      K
3     MEX  2011-5-7      K

In [139]: Table2 = FamilyVsWWTotal.assign(aveAge=60)

In [140]: Table2
Out[140]:
  Country      date  aveAge
0     USA  2011-4-3      60
1     CAN  2011-3-5      60
2     USA  2011-4-3      60
3     MEX  2011-5-7      60

In [141]: FamilyVsWWTotal
Out[141]:
  Country      date
0     USA  2011-4-3
1     CAN  2011-3-5
2     USA  2011-4-3
3     MEX  2011-5-7

或者,在copy上工作

In [142]: Table1 = FamilyVsWWTotal.copy()

In [143]: Table1['Region'] = 'K'

In [144]: Table1
Out[144]:
  Country      date Region
0     USA  2011-4-3      K
1     CAN  2011-3-5      K
2     USA  2011-4-3      K
3     MEX  2011-5-7      K

In [145]: FamilyVsWWTotal
Out[145]:
  Country      date
0     USA  2011-4-3
1     CAN  2011-3-5
2     USA  2011-4-3
3     MEX  2011-5-7

您需要为新的DataFrame对象使用^{},因为其他使用相同对象的操作(不使用copy不是值的copied,而是创建一个新的reference,所以id是相同的):

Table1=FamilyVsWWTotal.copy()

print (id(Table1))
243907608
print (id(FamilyVsWWTotal))
193392088
#crete new object (unlink to original df)
Table1 = FamilyVsWWTotal.copy()
Table2=FamilyVsWWTotal.copy()
Table1['Region'] = 'K'
Table2['aveAge']=60
print (FamilyVsWWTotal)
  Country      date
0     USA  2011-4-3
1     CAN  2011-3-5
2     USA  2011-4-3
3     MEX  2011-5-7

print (Table1)
  Country      date Region
0     USA  2011-4-3      K
1     CAN  2011-3-5      K
2     USA  2011-4-3      K
3     MEX  2011-5-7      K

print (Table2)
  Country      date  aveAge
0     USA  2011-4-3      60
1     CAN  2011-3-5      60
2     USA  2011-4-3      60
3     MEX  2011-5-7      60

#create refernce only
Table1=FamilyVsWWTotal

print (id(Table1))
244095352
print (id(FamilyVsWWTotal))
244095352

仍然修改原始数据帧FamilyVsWWTotal

Table1 = FamilyVsWWTotal
Table2=FamilyVsWWTotal
Table1['Region'] = 'K'
Table2['aveAge']=60
print (FamilyVsWWTotal)
  Country      date Region  aveAge
0     USA  2011-4-3      K      60
1     CAN  2011-3-5      K      60
2     USA  2011-4-3      K      60
3     MEX  2011-5-7      K      60

print (Table1)
  Country      date Region  aveAge
0     USA  2011-4-3      K      60
1     CAN  2011-3-5      K      60
2     USA  2011-4-3      K      60
3     MEX  2011-5-7      K      60

print (Table2)
  Country      date Region  aveAge
0     USA  2011-4-3      K      60
1     CAN  2011-3-5      K      60
2     USA  2011-4-3      K      60
3     MEX  2011-5-7      K      60

相关问题 更多 >

    热门问题