我正在尝试对列表进行排序(基于UserInfo类(,但是我遇到了一个错误 - assertionError:传递的3列,传递的数据有2列。尽管当我创建一个静态数组(使用一些固定值的虚拟数组(时,我没有得到此错误。
class UserInfo:
def __init__(self,name,id,address):
self.Name=name
self.EId=id
self.Address=address
from rwt import UserInfo
import pandas as pd
class saveuser:
usertoadd=[]
def adduser(self,name,id,address):
obj1=UserInfo(name,id,address)
obj1.Name=name
obj1.EId=id
obj1.Address=address
saveuser.usertoadd.append(obj1)
def sortbyname(self):
labels=['Name','EId','Address']
df = pd.DataFrame.from_records([saveuser.usertoadd],columns=labels)
df.sort_values(by=['Name'], axis =1)
print(df)
myObj=saveuser()
myObj.adduser("Susheel",1,"Delhi")
myObj.adduser("Kapil",3,"Dehradun")
print("---------------After sort------------------------")
myObj.sortbyname()
预期的结果列表应按名称排序。
您有多个错误。列表usertoadd
具有2个saveuser
对象,然后将其放在列表中以创建嵌套列表并将其传递给pd.DataFrame.from_records
。这会导致错误:AssertionError: 3 columns passed, passed data had 2 columns
。pd.DataFrame.from_records
不知道saveuser
属性,也无法在没有明确提供它们的情况下提取它们。您需要saveuser.__dict__
的传递列表到from_records
,因为它正确获取了Atributes-Values对的字典。
接下来,您没有将排序的df
保存回原始df
,而是对错误的axis
进行了排序。要解决此问题,您只需要指定其他参数inplace=True
并在axis=0
您只需要更改函数sortbyName(self(如下:
def sortbyname(self):
labels=['Name','EId','Address']
df = pd.DataFrame.from_records([user.__dict__ for user in saveuser.usertoadd], columns=labels)
df.sort_values(by=['Name'], axis =0, inplace=True)
print(df)
输出:
---------------After sort------------------------
Name EId Address
1 Kapil 3 Dehradun
0 Susheel 1 Delhi
您忘了分配给DF。我认为您希望您的名字从上到下是从A-Z起,所以这会做到:
df = df.sort_values(by='Name')
否则您做
df.sort_values(by='Name', inplace = True)