【问题标题】:How to create sorted list of values from mutiple columns in pandas?如何从熊猫的多列中创建排序的值列表?
【发布时间】:2023-04-02 19:07:01
【问题描述】:

我有一个数据框,其中 A 列和 B 列在排序时可以具有相同的值对。我想对这些列进行重复数据删除,因为我不关心我的应用程序中的顺序。

这是一个示例数据框:

import pandas as pd
df = pd.DataFrame({'col1':[1, 2, 3], 'col2':[2, 1, 4]})
print(df)

这是数据框的样子:

index col1  col2 

0     1     2 

1     2     1 

2     3     4

我想要实现的是创建一个新列,该列将为每一行包含前两个值的排序列表,这样我就可以根据该列对数据框进行重复数据删除。

key_column 如下所示:

0   [1, 2]

1   [1, 2]

2   [3, 4]

然后我会使用 df.drop_duplicates(col3)

我有一个想法,我应该使用 .apply 或 .map 或者一些 lambda 函数,但到目前为止我没有尝试过:

df.apply(lambda row: sorted([row[0], row[1]]), axis=1) # this sorts the column values in place but doesn't create a new column with a list
sorted([df['col1'], df['col2']]) # returns error The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
df.map(sorted) # dataframe object has no attribute map
df[['col1', 'col2']].apply(lambda x:
    sorted([','.join(x.astype(int).astype(str))]), axis=1) # creates a list but is not sorted

感谢您的帮助,我希望看到一个也有解释的解决方案 - 为什么它有效。

【问题讨论】:

    标签: python pandas dataframe lambda


    【解决方案1】:

    选项 1

    使用df.apply 并传递sorted

    In [1234]: df['col3'] = df.apply(tuple, 1).apply(sorted).apply(tuple)
    
    In [1235]: df.drop_duplicates('col3')
    Out[1235]: 
       col1  col2    col3
    0     1     2  (1, 2)
    2     3     4  (3, 4)
    

    选项 2

    df.values 上调用np.sort,然后将结果分配给新列。

    In [1208]: df['col3'] = pd.Series([tuple(x) for x in np.sort(df.values, 1)]); df
    Out[1208]: 
       col1  col2    col3
    0     1     2  (1, 2)
    1     2     1  (1, 2)
    2     3     4  (3, 4)
    
    In [1210]: df.drop_duplicates('col3')
    Out[1210]: 
       col1  col2    col3
    0     1     2  (1, 2)
    2     3     4  (3, 4)
    

    【讨论】:

    • 您能否澄清(或发布相关链接)选项 1 的工作原理以及为什么需要两次应用元组?例如,当我想将它转换为 numpy 数组时,我这样做:df.apply(tuple, 1).map(np.array) 并且它可以工作,但是当我这样做时 df.apply(np.array, 1) 它不起作用
    • @StefanK 我使用两个 apply 调用的唯一原因是因为我不想使用 lambda!但是你也可以使用 1。
    • @StefanK 在 sorted 调用之后,结果是列表(pandas 隐式转换它们)。所以需要另一个 apply 调用。
    • 太好了,感谢您的快速回复!我问了很久,因为我现在偶然发现了类似的问题。
    【解决方案2】:

    三个步骤:

    df['x'] = df.apply(lambda x: tuple(sorted(x)), axis=1)
    df = df.drop_duplicates('x')
    del df['x']
    

    【讨论】:

      猜你喜欢
      • 2019-12-23
      • 1970-01-01
      • 2021-09-29
      • 2023-01-14
      • 1970-01-01
      • 2020-12-27
      • 2016-12-01
      • 1970-01-01
      • 2013-09-24
      相关资源
      最近更新 更多