Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按熊猫中的列子值排序_Python_Pandas_Sorting - Fatal编程技术网

Python 按熊猫中的列子值排序

Python 按熊猫中的列子值排序,python,pandas,sorting,Python,Pandas,Sorting,我的熊猫数据框如下所示: --------------------------------------- Name | Stats --------------------------------------- Bob | { age : 42, profession: IT } Jill | { age : 35, profession: Engineer } Patric | { age : 37, profession: St

我的熊猫数据框如下所示:

---------------------------------------
 Name   | Stats                     
---------------------------------------
 Bob    | { age : 42, profession: IT }
 Jill   | { age : 35, profession: Engineer }
 Patric | { age : 37, profession: Student }
---------------------------------------
其中,
Stats
是一个类,
age
profession
都是该类的属性

我想按照
Stats
上的属性之一对该表进行排序。例如,按人的年龄对其进行排序,使表格看起来像:

---------------------------------------
 Name   | Stats                     
---------------------------------------
 Jill   | { age : 35, profession: Engineer }
 Patric | { age : 37, profession: Student }
 Bob    | { age : 42, profession: IT }
---------------------------------------
有没有一种方法可以让熊猫做到这一点?我只找到了按整列排序的方法


感谢

使用数据帧的一个主要要点是键入列以实现高效存储和计算速度(例如int64、float64、object等)。您的数据结构不好;在
Stats
中,每个字段都应该有一个单独的列。有关更多信息,请参阅

df2 = df[['Name']].assign(age=[d.get('age') for d in df['Stats']],
                          profession=[d.get('profession') for d in df['Stats']])
这样,处理数据就很容易了

>>> df2.sort_values('age')
     Name  age profession
1    Jill   35   Engineer
2  Patric   37    Student
0     Bob   42         IT

使用数据帧的一个要点是键入列以实现高效存储和计算速度(例如int64、float64、object等)。您的数据结构不好;在
Stats
中,每个字段都应该有一个单独的列。有关更多信息,请参阅

df2 = df[['Name']].assign(age=[d.get('age') for d in df['Stats']],
                          profession=[d.get('profession') for d in df['Stats']])
这样,处理数据就很容易了

>>> df2.sort_values('age')
     Name  age profession
1    Jill   35   Engineer
2  Patric   37    Student
0     Bob   42         IT

解决方案
您可以使用
argsort
查找适当的排序并将其传递给
iloc
。但是,您需要创建一个数据帧,以便在
age
列上运行
argsort

df.iloc[pd.DataFrame(df.Stats.values.tolist()).age.argsort()]

     Name                                  Stats
1    Jill  {'age': 35, 'profession': 'Engineer'}
2  Patric   {'age': 37, 'profession': 'Student'}
0     Bob        {'age': 42, 'profession': 'IT'}

读完这本书后,我想到了一个结合了他的想法和我的想法的东西。如果有人觉得这部分有用,请别忘了对他的答案投赞成票

df.iloc[np.argsort([x.get('age') for x in df.Stats])]
定时
小样本数据

%timeit df.iloc[pd.DataFrame(df.Stats.values.tolist()).age.argsort()]
%timeit df.iloc[np.argsort([x.get('age') for x in df.Stats])]
%timeit df.iloc[np.argsort([x.get('age') for x in df.Stats.values.tolist()])]

1000 loops, best of 3: 756 µs per loop
1000 loops, best of 3: 225 µs per loop
1000 loops, best of 3: 207 µs per loop
设置

df = pd.DataFrame(dict(
    Name='Bob Jill Patric'.split(),
    Stats=[
        dict(age=42, profession='IT'),
        dict(age=35, profession='Engineer'),
        dict(age=37, profession='Student')
    ]
))

解决方案
您可以使用
argsort
查找适当的排序并将其传递给
iloc
。但是,您需要创建一个数据帧,以便在
age
列上运行
argsort

df.iloc[pd.DataFrame(df.Stats.values.tolist()).age.argsort()]

     Name                                  Stats
1    Jill  {'age': 35, 'profession': 'Engineer'}
2  Patric   {'age': 37, 'profession': 'Student'}
0     Bob        {'age': 42, 'profession': 'IT'}

读完这本书后,我想到了一个结合了他的想法和我的想法的东西。如果有人觉得这部分有用,请别忘了对他的答案投赞成票

df.iloc[np.argsort([x.get('age') for x in df.Stats])]
定时
小样本数据

%timeit df.iloc[pd.DataFrame(df.Stats.values.tolist()).age.argsort()]
%timeit df.iloc[np.argsort([x.get('age') for x in df.Stats])]
%timeit df.iloc[np.argsort([x.get('age') for x in df.Stats.values.tolist()])]

1000 loops, best of 3: 756 µs per loop
1000 loops, best of 3: 225 µs per loop
1000 loops, best of 3: 207 µs per loop
设置

df = pd.DataFrame(dict(
    Name='Bob Jill Patric'.split(),
    Stats=[
        dict(age=42, profession='IT'),
        dict(age=35, profession='Engineer'),
        dict(age=37, profession='Student')
    ]
))

谢谢我很好奇,是什么让你想到尝试df.Stats.values.tolist()?如果有什么不同的话,我希望这会增加开销,而不是减少开销it@ZainRizvi这东西的经验让我想到了它。如果我想使用列表理解,那么遍历列表要比遍历pandas系列或numpy数组更快。谢谢我很好奇,是什么让你想到尝试df.Stats.values.tolist()?如果有什么不同的话,我希望这会增加开销,而不是减少开销it@ZainRizvi这东西的经验让我想到了它。如果我想使用列表理解,那么遍历列表要比遍历pandas系列或numpy数组更快。