如何对数据帧的单行进行排序

2024-05-19 00:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据框:

Client  Date        Value_1  Value_2  Value_3   Apple     Pear    Kiwi    Banana
ABC     2016-02-16  94       373      183       1739      38      19      73

ClientDataValue_1Value_2头是静态的。但是,这些列中的值可以更改。你知道吗

ApplePearKiwiBanana列标题是动态的。这些列中的值可以更改。你知道吗

我希望能够对数据帧进行排序,以便“color”列(在“value”列的右侧)按从高到低的顺序排列,如下所示:

Client  Date        Value_1  Value_2  Value_3   Apple     Banana   Pear     Kiwi
ABC     2016-02-16  94       373      183       1739      73       38       19

我尝试了以下代码:

new_df = df.columns[5:].sort_values(ascending=False)

但是,这只是对列标题本身进行排序,而不是对这些列中的值进行排序。你知道吗

有人知道如何做到这一点吗?你知道吗

谢谢!你知道吗


Tags: 数据client标题appledfdatadate排序
3条回答

您可以使用自定义函数:

cols = [col for col in df.columns if not col.startswith('Color')]
print (cols)
['Client', 'Date', 'Value_1', 'Value_2', 'Value_3']

def f(x):
    return pd.Series(x.sort_values(ascending=False).values, index=x.sort_values().index)

df = df.set_index(cols).apply(f, axis=1).reset_index()
print (df)
  Client        Date  Value_1  Value_2  Value_3  Color_3  Color_2  Color_4  \
0    ABC  2016-02-16       94      373      183     1739       73       38   

   Color_1  
0       19  

另一种解决方案:

#select to Series all values from position 5
x = df.ix[0, 5:]
print (x)
Color_1    1739
Color_2      38
Color_3      19
Color_4      73
Name: 0, dtype: object

#create DataFrame with sorting values and index of Series x
a = pd.DataFrame([x.sort_values(ascending=False).values], columns=x.sort_values().index)
print (a)
   Color_3  Color_2  Color_4  Color_1
0     1739       73       38       19

#concat to original
df = pd.concat([df[df.columns[:5]], a], axis=1)
print (df)
  Client        Date  Value_1  Value_2  Value_3  Color_3  Color_2  Color_4  \
0    ABC  2016-02-16       94      373      183     1739       73       38   

   Color_1  
0       19  

编辑byu更改的问题:

x = df.ix[:, 5:].sort_values(by=0, ascending=False, axis=1)
print (x)
   Apple  Banana  Pear  Kiwi
0   1739      73    38    19

df = pd.concat([df.ix[:, :5], x], axis=1)
print (df)
  Client        Date  Value_1  Value_2  Value_3  Apple  Banana  Pear  Kiwi
0    ABC  2016-02-16       94      373      183   1739      73    38    19

您需要为列创建新的顺序:

order = list(df.columns[:4]) + \
        list(zip(*sorted([(i, int(df[i])) for i in df.columns[4:]], key=lambda x: x[1], reverse=True))[0])

在这里,列名与列值一起zip,然后应用排序。zip(*[])解压排序的列表并保留列名。 然后将其应用于数据帧:

print df[order]

>>> Date     Value_1  Value_2  Value_3  Color_2  Color_1  Color_3  Color_4
0  ABC  2016-02-16       94      373     1739      183       38       19

您还可以使用numpy对它们进行排序。你知道吗

import pandas as pd, numpy as np

# Set up the test data
df = pd.DataFrame(np.ceil(np.random.rand(1,10)*1000))
values = ["Value_"+str(i) for i in range(5)] 
colors = ["Color_"+str(i) for i in range(5)]
df.columns = values + colors

# Order
idx = np.argsort(df[df.columns[5:]].values)[0]
# Reverse (descending order)
ridx = idx[::-1]

df[df.columns[5:][ridx]]

相关问题 更多 >

    热门问题