我有一个这样的数据框:
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
如何删除单元格中的重复项?
答案 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))
所有步骤都使用apply
和lambda
函数,如果需要,可以将它们链接或嵌套在一起</ p>
答案 3 :(得分:0)
所有先前的答案仅解决了问题的一部分,即显示唯一计数(no_destinations
)。让我尝试回答您的两个问题。
下面的想法是在Destinations
列上应用一种方法,该方法返回名为Destinations_2
和no_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())
输出:
注意:由于您不关心该顺序,因此我在上面使用了set
。如果您需要维护订单,则必须用其他一些逻辑替换set
才能删除重复项。