首页 > 解决方案 > 在 Pandas 数据框单元格中查找唯一值

问题描述

样本 DF

data = {'name': ['Jason , Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 
        'year': ['2012 , 2012 , 2016 , 2016', 2012, 2013, 2014, 2014], 
        'reports': ['4 , 4 , 5 , 6 , 6 , 7', 24, 31, 2, 3]}
df1 = pd.DataFrame(data, index = ['Cochice', 'Pima', 'Santa Cruz', 'Maricopa', 'Yuma'])

看起来像

                     name            ...                                   year
Cochice     Jason , Jason            ...              2012 , 2012 , 2016 , 2016
Pima                Molly            ...                                   2012
Santa Cruz           Tina            ...                                   2013
Maricopa             Jake            ...                                   2014
Yuma                  Amy            ...                                   2014

我希望Cochice索引的每个单元格都有唯一值。我试过了drop_duplicatesnunique但他们都没有工作。

在我原来的 df 中,列数可以超过 3

输出 Df

             name  reports       year
Cochice     Jason  4,5,6,7  2012,2016
Pima        Molly       24       2012
Santa Cruz   Tina       31       2013
Maricopa     Jake        2       2014
Yuma          Amy        3       2014

标签: python-3.xpandasunique

解决方案


我不知道有任何内置的 Pandas 函数可以做到这一点,所以我想出了一个解决方案applymap,它使用一个自定义函数来拆分逗号,去除空格,并将独特的元素重新组合成一个字符串。它并不漂亮,而且可能效率不高,但它应该可以工作:

In [15]: df1.applymap(lambda x: x if ',' not in str(x) else ','.join(sorted(set(y.strip() for y in(x.split(','))))))
Out[15]: 
             name  reports       year
Cochice     Jason  4,5,6,7  2012,2016
Pima        Molly       24       2012
Santa Cruz   Tina       31       2013
Maricopa     Jake        2       2014
Yuma          Amy        3       2014

编辑以显示仅应用于某个索引而不是所有行:

df1.loc[['Cochice']].applymap(lambda x: x if ',' not in str(x) else ','.join(sorted(set(y.strip() for y in(x.split(','))))))
Out[24]: 
          name  reports       year
Cochice  Jason  4,5,6,7  2012,2016

推荐阅读