2017-09-23 31 views
1

替换一个数据帧列中的唯一值我有一个数据帧像这样:与他们的计数

Index Label 
0  ABCD 
1  EFGH 
2  ABCD 
3  ABCD 
4  EFGH 
5  ABCD 
6  IJKL 
7  IJKL 
8  ABCD 
9  EFGH 

所以,“ABCD”时的5倍,“EFGH” 3次,“IJKL”两次。我要统计每个标签的发生和他们的计数代替单个标签,得到如下:

Index Label 
0  5 
1  3 
2  5 
3  5 
4  3 
5  5 
6  2 
7  2 
8  5 
9  3 

什么是做到这一点的最好方法是什么? 谢谢!

回答

2

使用map通过Series创建由value_counts

df['Label'] = df['Label'].map(df['Label'].value_counts()) 
print (df) 
    Label 
0  5 
1  3 
2  5 
3  5 
4  3 
5  5 
6  2 
7  2 
8  5 
9  3 

transform + size另一种解决方案:

df['Label'] = df.groupby('Label')['Label'].transform('size') 
print (df) 

    Label 
0  5 
1  3 
2  5 
3  5 
4  3 
5  5 
6  2 
7  2 
8  5 
9  3 
+0

'size'包括NaN的,而且是错误的。 –

+0

你确定吗?我认为总是有必要'size',如果需要排除'NaN'需要'count'(最少使用) – jezrael

+0

“用它们的计数替换元素”,所以不是nan计数。 groupby中的nans会发生什么? (我不知道,所以我问) –

1

使用groupbytransform

print(df) 
     Label 
Index  
0  ABCD 
1  EFGH 
2  ABCD 
3  ABCD 
4  EFGH 
5  ABCD 
6  IJKL 
7  IJKL 
8  ABCD 
9  EFGH 

df['Label'] = df.groupby('Label').Label.transform('count') 
print(df) 
     Label 
Index  
0   5 
1   3 
2   5 
3   5 
4   3 
5   5 
6   2 
7   2 
8   5 
9   3 

如果您的列没有NaN s,sizecount返回相同的值。否则,size包含NaN s,所以请避免使用它。


使用Counter另一种方式:

from collections import Counter 

df['Label'] = df.Label.map(Counter(df.Label)) 
print(df) 
     Label 
Index  
0   5 
1   3 
2   5 
3   5 
4   3 
5   5 
6   2 
7   2 
8   5 
9   3 
+0

@ P.Prunesquallor感谢您的支持。 –

+1

@ P.Prunesquallor另外,如果您使用groupby解决方案,请不要使用size作为jezrael的解决方案。 –

+0

我不明白'否则,尺寸包括NaNs,所以请避免使用它。“为什么要避免?我认为这两个函数都很好 - 而且我认为函数'count'是最好的不用的,只有当需要明确地排除NaN时。我认为没有理由避免使用'size',因为如果我知道我有一些NaN(并且我认为数据中没有NaN--特别是如果是浮点数据的话)是很好的。 – jezrael