如何向Pandas DataFrame追加字符串?代码报错及修改咨询
嘿,我来帮你搞定这个Pandas的报错问题~你遇到的cannot concatenate object of type '<class 'str'>'; only Series and DataFrame objs are valid错误,核心原因是Pandas的append()方法不接受直接传入字符串,它只认Series或者DataFrame对象。而且你之前的片段1其实也有隐性问题,只是没触发报错而已——allBooks.append(newBook)这行代码根本没修改原DataFrame,因为append()默认返回新对象,不会原地修改原数据。
先拆解问题根源
不管是片段1还是片段2,你想实现的是把字符串作为行索引,同时给对应列赋值,但直接用append(字符串)的方式完全不符合Pandas的规则。我们需要换一种正确的方式来添加行。
片段2的修改方案(推荐用loc,更高效)
loc是Pandas里用来定位行/列的利器,直接用它添加带索引的行是最直观且高效的方式,而且还能避免append()在新版本Pandas中被弃用的问题。修改后的完整代码如下:
import pandas as pd # 初始化DataFrame userData = pd.DataFrame(columns=['fname','lname','dob','pwd']) # 获取用户输入 fname = input("Please enter your first name. ") lname = input("Please enter your last name. ") dob = input("Please enter your DOB MM/DD/YYYY ") pwd = input("Type in the password you want to use. ") # 生成用户ID dobSeperate = dob.split("/") idChars = str(dobSeperate[1]) + str((dobSeperate[2])[2:4]) userId = fname.lower() + idChars print("This is your user ID, please write it down:", userId) print("This is your password, please remember it:", pwd) # 核心修改:用loc直接添加带索引的行 # 格式:df.loc[行索引] = [列1值, 列2值, ...],顺序要和DataFrame的columns对应 userData.loc[userId] = [fname, lname, dob, pwd] # 可选:保存到CSV userData.to_csv('user_inventory.csv', index=True) # index=True保留行索引(也就是userId) print(userId) print(userData) # 可以打印看结果
如果你坚持要用append()(不推荐,Pandas 2.0+已弃用)
如果一定要用append(),需要把要添加的内容包装成Series对象,同时指定索引(对应DataFrame的列名)和行名称(也就是你的userId),还要记得把append()的返回值重新赋值给原DataFrame(因为它不会原地修改):
# 替代loc的部分,用append实现 new_user = pd.Series( [fname, lname, dob, pwd], index=userData.columns, # 对应DataFrame的列 name=userId # 这就是行索引 ) userData = userData.append(new_user)
顺便修正片段1的隐性问题
你的片段1里allBooks.append(newBook)其实没生效,正确的写法应该和上面一样,用loc直接添加:
import pandas as pd allBooks = pd.DataFrame(columns=['Copies']) newBook = input("Enter the title of the book you wish to add ") newCopies = int(input("Enter the amount of copies of this book ")) # 直接用loc添加行和列值 allBooks.loc[newBook, 'Copies'] = newCopies allBooks.to_csv(r'totalInventory.csv', index=True)
这样就能顺利实现你想要的“把字符串作为索引追加到DataFrame并赋值”的功能啦~
内容的提问来源于stack exchange,提问作者Axeinator

