【问题标题】:Pandas: Sort DataFrame Cells across columns if unorderedPandas:如果无序,则跨列对 DataFrame 单元格进行排序
【发布时间】:2020-07-21 20:19:30
【问题描述】:

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

在 Pandas DataFrame 中修改(排序)一系列数据的最佳方法是什么? 比如导入一些数据后,colums应该是升序的,但如果不是,我需要重新排序数据。数据正在从csv 导入到pandas.df

           num_1    num_2   num_3
date
2020-02-03  17      22       36
2020-02-06  52      22       14
2020-02-10  5        8       29
2020-02-13  10      14       30
2020-02-17  7        8       19

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

           num_1    num_2   num_3    num_4     num_5
date
2020-02-06  52      22       14       25         27

并将其修改为:(仅对数字 1-3 进行排序,而不涉及第 4 和 5 列)

           num_1    num_2   num_3    num_4   num_5
date
2020-02-06  14      22       52        25      27

我可以遍历 DataFrame 并通过将每一列与正确的列进行比较来检查序列数据乱序的索引。然后编写一个自定义排序器并将该记录重写回 Dataframe,但这似乎很笨重。

我不得不想象有一种更 Pythonic (Pandas) 的方式来做这种事情。我只是在熊猫文档中找不到它。我不想对行重新排序,只需确保值在列中的顺序正确。

更新:我忘了提到最关键的方面之一。 DataFrame 中还有其他列不应被触及。所以在下面的例子中,只有sort (num_1, num_2, num_3) 而不是其他的。我猜我可以使用已经提出的解决方案,拆分 DataFrame,对第一部分进行排序并将它们重新合并在一起。有其他选择吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      最好的方法是使用 sort_values() 函数,并且只允许它在需要排序的列上工作。

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

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

      【讨论】:

      • 很好的答案,谢谢。我选择了另一个答案,因为它避免了遍历 DataFrame。
      【解决方案3】:

      Pandas 默认不支持您的要求(据我所知)。通常每一列都是不同的特征,所以改变它的值可能看起来有点奇怪。 无论如何,pandas 与 numpy 配合得非常好。这是你的救命稻草。

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

      import numpy as np
      cols_list = ["num_1","num_2","num_3"]
      tmp_arr = np.array(df.loc[:, cols_list])
      tmp_arr.sort(axis=1)
      df.loc[:, cols_list] = tmp_arr
      

      完整示例:

      import pandas as pd
      import numpy as np
      
      df = pd.DataFrame({"Day":range(1,5),"num_1":[5,2,7,1], "num_2":[2,7,4,10], "num_3":[7,27,64,10]})
      
      print(df)
      
      cols_list = ["num_1","num_2","num_3"]
      tmp_arr = np.array(df.loc[:, cols_list])
      tmp_arr.sort(axis=1)
      df.loc[:, cols_list] = tmp_arr
      
      print(df)
      

      第一个打印结果:

         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_list)。

      在我写完这篇文章后,我在这里找到了类似的解决方案:Fastest way to sort each row in a pandas dataframe

      【讨论】:

      • 另一个很棒的答案(和参考)。谢谢!选择的解决方案也使用 Numpy。我选择了获胜者,因为它避免了切片并使用了更多的内置插件(即isin),所以我认为它可以让其他人更容易阅读。
      猜你喜欢
      • 1970-01-01
      • 2018-07-03
      • 2014-11-29
      • 2020-09-16
      • 2021-04-20
      • 2016-09-14
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多