Python 删除da的同一单元格中的重复值和计数值
我有一个示例数据框,其中a列包含重复的值,如下所示:Python 删除da的同一单元格中的重复值和计数值,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个示例数据框,其中a列包含重复的值,如下所示: a 0 1089, 1089, 1089 1 10A3, 10A3 2 10A3, 10A4, 10A4 3 TEL, TV 4 EZ, EZ 5 ABC Co., ABC Co. 我想删除重复项并计算每个单元格的值: a count 0 1089 1 1 10A3 1 2 10A3, 10
a
0 1089, 1089, 1089
1 10A3, 10A3
2 10A3, 10A4, 10A4
3 TEL, TV
4 EZ, EZ
5 ABC Co., ABC Co.
我想删除重复项并计算每个单元格的值:
a count
0 1089 1
1 10A3 1
2 10A3, 10A4 2
3 TEL, TV 2
4 EZ 1
5 ABC Co. 1
在轴=1上使用和求和
df['count'] = df.a.str.get_dummies(sep=', ').sum(1)
要删除重复项,请使用explode
s = df.assign(a=df.a.str.split(', ')).explode('a').drop_duplicates()
如果你真的需要它在同一行
s.groupby(s.index).agg({'a': ', '.join, 'count': 'first'})
a count
0 1089 1
1 10A3 1
2 10A3, 10A4 2
3 TEL, TV 2
4 EZ 1
5 ABC Co. 1
或者简单地使用@WeNYoBen巧妙的解决方案;)
您需要定义自己的方法并将其应用于数据帧
def list_count(x):
l=pd.Series(x.split(',')).str.strip().drop_duplicates().tolist()
return pd.Series([', '.join(l), len(l)])
df['a'].apply(lambda x: list_count(x)).rename(columns={0:'a', 1:'count'})
输出:
a count
0 1089 1
1 10A3 1
2 10A3, 10A4 2
3 TEL, TV 2
4 EZ 1
5 ABC Co. 1
试试这个
def f(x):
l = x.split(',')
d = {}
for key in l:
if key.rstrip() not in d:
d[key.rstrip()] = 0
d[key.rstrip()]+=1
return ','.join(list(d.keys()))
df['a_new'] = df['a'].apply(lambda x:f(x))
print(df)
df['count'] = df['a_new'].apply(lambda x: len(x.split(',')))
感谢您的输入,但重复的值似乎没有被删除。我创建了一个新列,因此您可以使用df.drop(['a'],axis=1)删除旧列。乐意帮助!!我得到一个错误:AttributeError:'DataFrame'对象没有属性'explode'@JennyJingYu that;s仅适用于pandas版本0.25
及以上版本!感谢您的方法,我在示例数据集中工作,但在应用于大型数据集时速度非常慢。
a count
0 1089 1
1 10A3 1
2 10A3, 10A4 2
3 TEL, TV 2
4 EZ 1
5 ABC Co. 1
def f(x):
l = x.split(',')
d = {}
for key in l:
if key.rstrip() not in d:
d[key.rstrip()] = 0
d[key.rstrip()]+=1
return ','.join(list(d.keys()))
df['a_new'] = df['a'].apply(lambda x:f(x))
print(df)
df['count'] = df['a_new'].apply(lambda x: len(x.split(',')))