Python Pandas:如果未排序,则跨列对数据帧单元格进行排序

Python Pandas:如果未排序,则跨列对数据帧单元格进行排序,python,pandas,dataframe,Python,Pandas,Dataframe,看起来我的最后一个问题已经结束了,但是我第一次忘记提到下面的更新。仅修改少数列,而不是全部列 修改数据帧中一系列数据排序的最佳方法是什么? 例如,导入一些数据后,列应该按升序排列,但如果不是,我需要对数据重新排序。正在将数据从csv导入pandas.df 理想情况下,我会在数据框中找到第二行熊猫系列作为要修复的记录: num_1 num_2 num_3 num_4 num_5 date 2020-02-06 52 22 14

看起来我的最后一个问题已经结束了,但是我第一次忘记提到下面的更新。仅修改少数列,而不是全部列

修改数据帧中一系列数据排序的最佳方法是什么? 例如,导入一些数据后,列应该按升序排列,但如果不是,我需要对数据重新排序。正在将数据从csv导入pandas.df

理想情况下,我会在数据框中找到第二行熊猫系列作为要修复的记录:

           num_1    num_2   num_3    num_4     num_5
date
2020-02-06  52      22       14       25         27
并将其修改为:仅对NUM 1-3进行排序,不接触第4列和第5列

我可以迭代数据帧,并通过将每一列与右边的列进行比较来检查序列数据无序的索引。然后编写一个自定义分类器并将该记录重写回数据帧,但这看起来很笨拙

我不得不想象有一种更像蟒蛇的方式来做这类事情。我只是在熊猫的文档中找不到它。我不想对行重新排序,只要确保值在列中的顺序正确即可


更新:我忘了提到一个最关键的方面。DataFrame中还有其他不应触摸的列。因此,在下面的示例中,只对num_1、num_2、num_3进行排序,而不是对其他的排序。我猜我可以使用已经提出的解决方案,拆分数据帧,对第一部分进行排序,然后将它们重新合并在一起。有其他选择吗?

据我所知,熊猫不支持您默认要求的内容。通常每一列都是一个不同的特性,因此更改它的值似乎有点奇怪。 不管怎么说,熊猫和numpy相处得非常好。这是你的救命稻草

您可以将相关列转换为numpy数组,按行排序,然后将结果放回数据帧中

将numpy作为np导入 cols_list=[num_1,num_2,num_3] tmp_arr=np.arraydf.loc[:,cols_list] tmp_arr.sortaxis=1 df.loc[:,cols_list]=tmp_arr 完整示例:

作为pd进口熊猫 将numpy作为np导入 数据帧{Day:range1,5,num_1:[5,2,7,1],num_2:[2,7,4,10],num_3:[7,27,64,10]} printdf cols_list=[num_1,num_2,num_3] tmp_arr=np.arraydf.loc[:,cols_list] tmp_arr.sortaxis=1 df.loc[:,cols_list]=tmp_arr printdf 第一次打印结果:

   Day  num_1  num_2  num_3
0    1      5      2      7
1    2      2      7     27
2    3      7      4     64
3    4      1     10     10
   Day  num_1  num_2  num_3
0    1      2      5      7
1    2      2      7     27
2    3      4      7     64
3    4      1     10     10
第二次打印结果:

   Day  num_1  num_2  num_3
0    1      5      2      7
1    2      2      7     27
2    3      7      4     64
3    4      1     10     10
   Day  num_1  num_2  num_3
0    1      2      5      7
1    2      2      7     27
2    3      4      7     64
3    4      1     10     10
您可以选择任何您喜欢的列


在我已经写了这篇文章之后,我在这里找到了类似的解决方案:

据我所知,熊猫不支持您默认要求的内容。通常每一列都是一个不同的特性,因此更改它的值似乎有点奇怪。 不管怎么说,熊猫和numpy相处得非常好。这是你的救命稻草

您可以将相关列转换为numpy数组,按行排序,然后将结果放回数据帧中

将numpy作为np导入 cols_list=[num_1,num_2,num_3] tmp_arr=np.arraydf.loc[:,cols_list] tmp_arr.sortaxis=1 df.loc[:,cols_list]=tmp_arr 完整示例:

作为pd进口熊猫 将numpy作为np导入 数据帧{Day:range1,5,num_1:[5,2,7,1],num_2:[2,7,4,10],num_3:[7,27,64,10]} printdf cols_list=[num_1,num_2,num_3] tmp_arr=np.arraydf.loc[:,cols_list] tmp_arr.sortaxis=1 df.loc[:,cols_list]=tmp_arr printdf 第一次打印结果:

   Day  num_1  num_2  num_3
0    1      5      2      7
1    2      2      7     27
2    3      7      4     64
3    4      1     10     10
   Day  num_1  num_2  num_3
0    1      2      5      7
1    2      2      7     27
2    3      4      7     64
3    4      1     10     10
第二次打印结果:

   Day  num_1  num_2  num_3
0    1      5      2      7
1    2      2      7     27
2    3      7      4     64
3    4      1     10     10
   Day  num_1  num_2  num_3
0    1      2      5      7
1    2      2      7     27
2    3      4      7     64
3    4      1     10     10
您可以选择任何您喜欢的列


在我写了这篇文章之后,我在这里找到了类似的解决方案:

拆分和重新连接对我来说并不坏,以下是我得到的:

cols_to_sort = ['num_1', 'num_2', 'num_3']
pd.concat([pd.DataFrame(np.sort(df[cols_to_sort].values), columns=cols_to_sort, index=df.index), df[df.columns[~df.columns.isin(cols_to_sort)]]], axis=1)

拆分和重新连接对我来说并不坏,以下是我得到的:

cols_to_sort = ['num_1', 'num_2', 'num_3']
pd.concat([pd.DataFrame(np.sort(df[cols_to_sort].values), columns=cols_to_sort, index=df.index), df[df.columns[~df.columns.isin(cols_to_sort)]]], axis=1)

最好的方法是使用sort_values函数,只允许它处理需要排序的列

for index, rows in df.iterrows(): 
    df[['col1','col2','col3']] = df[['col1','col2','col3']].sort_values(by=[index], axis = 1, ascending = True)

这将遍历每一行,使所需列中的值升序,然后重新保存列。

最好的方法是使用sort\u values函数,只允许它在需要排序的列上工作

for index, rows in df.iterrows(): 
    df[['col1','col2','col3']] = df[['col1','col2','col3']].sort_values(by=[index], axis = 1, ascending = True)

这将遍历每一行,使所需列中的值升序,然后重新保存列。

回答得好,谢谢。我选择了另一个答案,因为它避免了重复数据帧。回答很好,谢谢。我选择了另一个答案,因为它避免了重复数据帧。另一个很棒的答案和参考。谢谢选择的解决方案也使用Numpy。我之所以选择赢家,是因为它避免了切片,并且使用了更多的内置功能,例如isin,所以我认为它可以让其他人更容易阅读。另一个很棒的答案和参考。谢谢选择的解决方案也使用Numpy。我选择了赢家,因为它避免了切片,并且使用了更多的内置功能,例如isin,所以我认为它可以让其他人更容易阅读。