删除熊猫细胞中的重复元素并计算元素数量

时间:2019-06-29 10:52:49

标签: python pandas

我有一个这样的数据框:

Destinations
Paris,Oslo, Paris,Milan, Athens,Amsterdam
Boston,New York, Boston,London, Paris,New York
Nice,Paris, Milan,Paris, Nice,Milan

我想获得以下数据框(城市之间没有空间):

Destinations_2                         no_destinations
Paris,Oslo,Milan,Athens,Amsterdam      5
Boston,New York,London,Paris           4
Nice,Paris,Milan                       3

如何删除单元格中的重复项?

4 个答案:

答案 0 :(得分:3)

您可以使用列表理解方法,该列表理解方法比使用apply()(用原始列名替换Col)更快:

df['no_destinations']=[len(set([a.strip() for a in i.split(',')])) for i in df['Col']]
print(df)

                                              Col  no_destinations
0       Paris,Oslo, Paris,Milan, Athens,Amsterdam                5
1  Boston,New York, Boston,London, Paris,New York                4
2             Nice,Paris, Milan,Paris, Nice,Milan                3

答案 1 :(得分:1)

ProcessBuilder

如果两次使用之间有空格

  val processBuilder = ProcessBuilder("ls", "/system/bin/")

输出

df['no_destinations'] = df.Destinations.str.split(',').apply(set).apply(len)

答案 2 :(得分:1)

# your data:
import pandas as pd

data = {'Destinations': ['Paris,Oslo, Paris,Milan, Athens,Amsterdam',
                         'Boston,New York, Boston,London, Paris,New York',
                         'Nice,Paris, Milan,Paris, Nice,Milan']}
df = pd.DataFrame(data)

>>>
                                      Destinations
0        Paris,Oslo, Paris,Milan, Athens,Amsterdam
1   Boston,New York, Boston,London, Paris,New York
2              Nice,Paris, Milan,Paris, Nice,Milan

第一:将列的每一行都列为列表。

df.Destinations = df.Destinations.apply(lambda x: x.replace(', ', ',').split(','))

>>>
                                           Destinations
0        [Paris, Oslo, Paris, Milan, Athens, Amsterdam]
1   [Boston, New York, Boston, London, Paris, New York]
2              [Nice, Paris, Milan, Paris, Nice, Milan]

第二:从列表中删除重复项

df.Destinations = df.Destinations.apply(lambda x: list(dict.fromkeys(x)))

# or: df.Destinations = df.Destinations.apply(lambda x: list(set(x)))

>>>
                               Destinations
0   [Paris, Oslo, Milan, Athens, Amsterdam]
1         [Boston, New York, London, Paris]
2                      [Nice, Paris, Milan]

最后,创建所需的列

df['no_destinations'] = df.Destinations.apply(lambda x: len(x))

df['Destinations_2'] = df.Destinations.apply(lambda x: ','.join(x))

所有步骤都使用applylambda函数,如果需要,可以将它们链接或嵌套在一起<​​/ p>

答案 3 :(得分:0)

所有先前的答案仅解决了问题的一部分,即显示唯一计数(no_destinations)。让我尝试回答您的两个问题。

下面的想法是在Destinations列上应用一种方法,该方法返回名为Destinations_2no_destinations的2个系列,它们包含用逗号分隔的唯一元素,不带空格,并且不重复数元素。

import pandas as pd
data = {'Destinations': ['Paris,Oslo, Paris,Milan, Athens,Amsterdam', 
                'Boston,New York, Boston,London, Paris,New York',
                'Nice,Paris, Milan,Paris, Nice,Milan'
    ]}

def remove_dups(x):
    data = set(x.replace(" ", "").split(','))
    return pd.Series([','.join(data),len(data)], index=['Destinations_2', 'no_destinations'])

df = pd.DataFrame.from_dict(data)
df[['Destinations_2', 'no_destinations']] = df['Destinations'].apply(remove_dups)
print(df.head())

输出:

enter image description here

注意:由于您不关心该顺序,因此我在上面使用了set。如果您需要维护订单,则必须用其他一些逻辑替换set才能删除重复项。

相关问题