【问题标题】:Is there any way to sort the dataframe column which contain lists?有没有办法对包含列表的数据框列进行排序?
【发布时间】:2022-01-09 20:04:14
【问题描述】:

我在包含列表数据的数据框中有一列

例如:

enter code here
| Column 1 | Column 2                  |
|--------- |---------------------------|
|    1     | ['jan']                   |
|    2     | ['jan','feb']             |
|    3     | ['feb','jan']             |
|    4     | ['mar','april','jan']     |
|    5     | ['jan','mar','april']     |
|    6     | ['jan','feb','mar']       |
|    7     | ['jan','feb','mar']       |

如上表所示,我们可以看到第 2 列、第 2 行和第 3 行具有相同的列表,但顺序不同。其他值也是如此。喜欢(第 4 行和第 5 行)

我必须按这个顺序排序

enter code here ['oct' ,'nov' ,'dec' ,'jan' ,'feb' ,'march' ,'april']

所需的输出应如下所示,新列 3 具有排序值

enter code here
| Column 1 | Column 2                  |      Column 3             |
|--------- |---------------------------|---------------------------|
|    1     | ['oct']                   | ['oct']                   |
|    2     | ['oct','nov']             | ['oct','nov']             |
|    3     | ['nov','oct']             | ['oct','nov']             |
|    4     | ['mar','april','jan']     | ['jan','mar','april']     |
|    5     | ['jan','mar','april']     | ['jan','mar','april']     |
|    6     | ['jan','feb','mar']       | ['jan','feb','mar']       |
|    7     | ['jan','feb','mar']       | ['jan','feb','mar']       |

【问题讨论】:

    标签: python pandas data-science


    【解决方案1】:

    通过使用enumerate 创建字典来使用sorted

    #import ast
    
    #converted to lists if necessary
    df['Column 2'] = df['Column 2'].apply(ast.literal_eval)
    
    months = ['oct' ,'nov' ,'dec' ,'jan' ,'feb' ,'mar' ,'april']
    
    d = {v: k for k, v in enumerate(months)}
       
    df['Column 2'] = df['Column 2'].apply(lambda x: sorted(x, key=lambda y: d[y]))
    print (df)
       Column 1           Column 2
    0         1              [jan]
    1         2         [jan, feb]
    2         3         [jan, feb]
    3         4  [jan, mar, april]
    4         5  [jan, mar, april]
    5         6    [jan, feb, mar]
    6         7    [jan, feb, mar]
    

    如果值是前 3 个字母,则可以按日期时间排序:

    df['Column 2'] = df['Column 2'].apply(lambda x: sorted(x, key=lambda y: pd.to_datetime(y, format='%b')))
    print (df)
       Column 1         Column 2
    0         1            [jan]
    1         2       [jan, feb]
    2         3       [jan, feb]
    3         4  [jan, mar, apr]
    4         5  [jan, mar, apr]
    5         6  [jan, feb, mar]
    6         7  [jan, feb, mar]
    

    【讨论】:

    • 感谢@jezrael 的反馈。第一种方法有效,但为什么它不能散列,以及'ast'在这里做什么。在第二种情况下,因为我们没有年份信息,它如何在 1 月之前带来 oct、nov 和 dec。 10 月、11 月和 12 月是上一年的月份。 1 月、2 月紧随其后。
    猜你喜欢
    • 1970-01-01
    • 2017-09-08
    • 2022-01-14
    • 2020-10-29
    • 2020-03-28
    • 1970-01-01
    • 2012-07-07
    • 2013-02-22
    • 1970-01-01
    相关资源
    最近更新 更多