根据单个单元格中的多个值对熊猫数据框进行排序

时间:2020-05-09 21:16:54

标签: python python-3.x pandas

我有一个数据框,其中一列包含多个数据

    ID                                            classes
4   5792.0  Mechanics (any of the two sessions), Analysis ...
6   5915.0  Mechanics (any of the two sessions), Perspecti...
8   5931.0                        CS, Chemistry, Perspecti...
9   5991.0                                    Perspective, CS
10  5841.0  Mechanics (any of the two sessions), Perspecti...

“类别”列可以具有“透视,化学,CS”等值。 我想根据类字符串中的值对上述数据框进行排序

例如一个输出可能是

        ID  classes                                         
4   5792.0       CS
6   5915.0       CS
8   5931.0       CS
9   5991.0       CS                            
10  5841.0       CS

因此根据参加的班级进行排序,

我搜索了google,但所有结果都是根据单个值(每个单元格单个值)对数据框进行排序

预先感谢

3 个答案:

答案 0 :(得分:1)

数据

df=pd.DataFrame({'ID':[5792.0,5915.0,5931.0,5991.0,5841.0 ],'classes':['Mechanics (any of the two sessions), Perspecti,CS, Chemistry','Mechanics (any of the two sessions), Perspecti,CS, Chemistry','Mechanics (any of the two sessions), Perspecti,CS, Chemistry','Mechanics (any of the two sessions), Perspecti,CS, Chemistry','Mechanics (any of the two sessions), Perspecti,CS, Chemistry']})
df

使用df.str.split将classes中的字符串转换为列表

df['classes']=df.classes.str.split(",")

classes

进行爆炸和排序
df.explode('classes').sort_values(by='classes')

结果

enter image description here

答案 1 :(得分:0)

我假设您要对“类”列中的每个字符串进行排序(用逗号分隔),您可以尝试以下操作:

df['string'] = df['classes'].apply(lambda x: ' '.join(sorted(x.split(', '))))
print(df)

答案 2 :(得分:0)

我确定还有更多的“熊猫”方式,但这是一种可能的解决方案:

cs_df = df[df['classes'].apply(lambda x: 'CS' in x)]
cs_df['classes'] = 'CS'

在上面的示例中,cs_df应该包含原始数据帧中'CS'classes中的所有行。您可以手动执行此操作,也可以循环执行此操作以获取所有数据框。

说明:

当我们使用df['classes']时,pandas返回一个numpy.Series实例。 numpy.Series.apply接受一个函数作为参数,并将其应用于系列中的每个项目。例如:

# square each item in the series
s1 = numpy.Series([1,2,3]).apply(lambda x: x*x)
#[1,4,9]
# root each item in the series
s2 = s1.apply(sqrt)
#[1,2,3]

熊猫还具有特殊的索引逻辑。如果您使用Series中的bool作为Dataframe的索引,熊猫将返回Dataframe,其中索引系列中的项目为True

所以在这个例子中

s = numpy.Series([True, False, True])
df2 = df[s]

df2仅包含原始0中的行2df

最后,熊猫还具有按索引分配的特殊逻辑。您可以将整个列设置为单个标量值,而无需展开循环:

df['best_column'] = "best value"

在上面的示例中,数据框将有一个新列,其中填充了值"best value"