我正在尝试更改熊猫内一行的值。
我将在我的.csv文件的前两行中添加内容,以便对数据有所了解。
section,price,seats,type
101,50.00,150,matinee
如您所见,这很简单。这是问题所在。
localList = matineeSeats.df.loc[matineeSeats.df['section'] == int(selection)] #Create slice of DataFrame for selected section
if localList.iloc[0, 2] > 0: #If theres more than 0 seats left... Cant do [0, 'seats']
print("Taking seat")
#Set the seats -= 1 ###THIS LINE###
注意:由于某种原因,我无法通过执行localList.iloc ['seats']访问数据,但也许我做错了吗?
我无法弄清楚如何在每次购买时将座椅减1。我的所有问题都来自“这条线”。我尝试将值设置为等于负1,然后得到以下结果。
if localList.iloc[0, 2] > 0:
print("Taking seat")
localList.iloc[0, 2] = localList.iloc[0, 2] - 1
print(localList.iloc[0, 2])
SettingWithCopyWarning:试图在一个副本上设置一个值 从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] = 值代替
请参阅文档中的警告: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy self.obj [item] = s
看到这一点之后,我多次按下了“购买”按钮,但它始终停留在先前的数据-1,并且再也不会降低。因此,我尝试了在控制台中提供的内容。使用LOC代替ILOC
if localList.iloc[0, 2] > 0:
print("Taking seat")
localList.loc[0, 2] = localList.loc[0, 2] - 1
print(localList.iloc[0, 2])
TypeError:无法使用类'int'的这些索引器[2]进行标签索引
然后我只想将其限制为一个变量,以测试我是否甚至可以使用LOC触摸此数据,看来我做不到。
localList.loc[0, 2] -= 1
TypeError:无法使用类'int'的这些索引器[2]进行标签索引
在这里,我想看看我使用LOC而不是ILOC正在做什么。所以我只是打印出数据。它与ILOC没什么不同,所以为什么我不能以相同的方式访问此数据?
print(localList.loc[0])
第101条
价格50
可容纳150人
类型日场
名称:0,dtype:对象
所以我不认为保存切片不会阻止它更新数据帧。因此,在测试时,我发现我需要获取我的localList并将其保存回最初选择它的框架中。
答案 0 :(得分:0)
修改:我现在已经理解了这个问题。您正在尝试更新原始数据帧matineeSeats.df
,而不是localList
您正在使用.loc
选择来创建副本
import pandas as pd
matineeSeats_df = pd.DataFrame([{'section': 101, 'price': 50.0, 'seats': 150, 'type': 'matinee'}])
# this creates a copy
localList = matineeSeats_df.loc[matineeSeats_df['section'] == 101]
# just localList gets updated, matineeSeats_df is not updated
localList.at[0, 'seats'] = localList.at[0, 'seats'] - 1
要直接更新matineeSeats_df
,您可以这样做:
matineeSeats_df.loc[matineeSeats_df['section'] == 101, 'seats'] -= 1