【问题标题】:Return the unique values of a specific column line by line逐行返回特定列的唯一值
【发布时间】:2021-12-26 14:01:50
【问题描述】:

我有以下dataframe

  column1 column2  
0 Paul       xx       
1 John       aa      
2 Paul       gg      
3 John       xx       
4 John       bb       
5 George     gg       
6 Paul       gg
7 john       xx
.
n Jonathan   ff     

我想将每个人的信息排成一行。在同一个row 上,我想要index,但在另一个column 上。所以我想要一个像这样的dataframe

  column1     column2   column3  
 0 Paul        0,2,6     xx, gg, gg       
 1 John        1,3,4,7   aa, xx, bb, xx             
 5 George      5         gg       
 .
 .
 .
 n Jonathan    n         ff

为了让上面的dataframe我执行

df2 = df.reset_index().groupby('column1').agg(list).reset_index()
ix = pd.Index(df2['index'].str.get(0)).rename(None)
df3 = df2.set_index(ix).sort_index()
df3

返回:

      column1      index          column2
0        Paul     [0, 2, 6]      [xx, gg, gg]
1        John     [1, 3, 4, 7]   [aa, xx, bb,xx]
5      George        [5]             [gg]

之后,我删除了column1index。 要将column2 的值以不表示为list 的格式显示,我执行:

def transform_list(df3):
    df3['column2'] = df3['column2'].apply(lambda x: ','.join(x))
    return df3

dfb=transform_list(df3)

df3.head()

返回:

    column2
0   xx, gg, gg
1   aa, xx, bb,xx
5   gg

所以现在我想要的是拥有每个 row 的唯一值

所以我的最终dataframe 将是

  column2
0   xx, gg
1   aa, xx, bb
5   gg

有什么想法吗?

【问题讨论】:

  • ','.join(set(x))?

标签: python python-3.x dataframe


【解决方案1】:

只要你的输出中元素的顺序无关紧要,你可以重新定义你的函数,如下所示:

def transform_list(df3):
    df3['column2'] = df3['column2'].apply(lambda x: ','.join(set(x)))
    return df3

集合本身只包含唯一元素,因此将列表x 转换为集合将丢弃所有重复项。但是,集合本质上是无序的,因此如果顺序很重要,您可能会得到意想不到的结果。

如果顺序很重要,您可以使用版本

def transform_list(df3):
    df3['column2'] = df3['column2'].apply(lambda x: ','.join(list(dict.fromkeys(x))))
    return df3

这会创建一个字典(按插入顺序排列),其中包含初始列表 x 中的键,并且由于键不能被多次定义,我们最终只能得到唯一的元素。转换回列表从字典中获取键,工作流程的其余部分可以根据需要继续进行而无需更改。

【讨论】:

    【解决方案2】:

    您可以将每个列表转换为一个集合,然后再转换回一个列表,以消除重复条目。这可以在您的 lambda 函数中完成:

    import pandas as pd
    
    df = pd.DataFrame({'column2': [['xx', 'gg', 'gg'],
                                   ['aa', 'xx', 'bb', 'xx'],
                                   ['gg']]},
                      index=[0, 1, 5])
    
    df['column2'] = df.column2.apply(lambda x: ', '.join(list(set(x))))
    df
    
        column2
    0   gg, xx
    1   bb, xx, aa
    5   gg
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多