python panda中引用类型列表的排序问题

时间:2019-05-19 19:07:04

标签: pandas python-3.7

我正在尝试对列表进行排序(基于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()

列表的预期结果应按名称排序。

2 个答案:

答案 0 :(得分:1)

您有多个错误。列表usertoadd有2个saveuser对象,您将其放入列表中以创建嵌套列表并将其传递给pd.DataFrame.from_records。这将导致错误:AssertionError: 3 columns passed, passed data had 2 columnspd.DataFrame.from_records不知道saveuser属性,如果不显式提供它们,它就无法提取它们。您需要将saveuser.__dict__的列表传递到from_records才能正确获取属性值对字典。

接下来,您没有将排序后的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

答案 1 :(得分:0)

您忘记分配给df。我假设您希望您的名字从上到下从A到Z,所以这样做:

df = df.sort_values(by='Name')

还是你

df.sort_values(by='Name', inplace = True)