【问题标题】:pandas dataframe duplicate values count not properly working熊猫数据框重复值计数无法正常工作
【发布时间】:2021-08-27 10:27:29
【问题描述】:

值计数为:df['ID'].value_counts().values -----> 数组([4,3,3,1], dtype=int64)

输入

ID emp
a  1
a  1
b  1
a  1
b  1
c  1
c  1
a  1
b  1
c  1
d  1

当我弄乱了 ID 列时

df.loc[~df.duplicated(keep='first', subset=['ID']), 'emp']= df['ID'].value_counts().values

输出

ID emp 
a  4
c  3
d  3
c  1
b  1
a  1
c  1
a  1
b  1
b  1
a  1

预期结果

ID emp 
a  4
c  3
d  1
c  1
b  3
a  1
c  1
a  1
b  1
b  1
a  1

问题:计数在分配 emp 之前没有检查 ID。

【问题讨论】:

  • 我尝试为给定的数据运行代码 sn-p,输出与您预期的相同,您有 ID 列作为索引吗?你可以加入yesterday's chat here
  • 我的 ID 混乱:ID emp a 4 c 1 d 3 c 1 b 1 a 3 c 1 a 1 b 1 b 1 a 1
  • IDK 如果这已经被问过但是pandas 版本?
  • >pandas) (1.15.0) 我更新了问题以便更好地理解
  • 如果我更改了 ID 列顺序,则无法正确映射 ID。那么有没有办法将计数映射到相同的 emp 值?

标签: python pandas dataframe count duplicates


【解决方案1】:

仅此一项就为您的给定示例数据框提供了 df.loc[~df.duplicated(keep='first', subset=['ID']), 'emp']= df['ID'].value_counts().values 所需的输出

但你可以试试:

cond=~df.duplicated(keep='first', subset=['ID'])

df.loc[cond,'emp']=df.loc[cond,'ID'].map(df['ID'].value_counts())

【讨论】:

  • df.loc[~df.duplicated(keep='first', subset=['ID']), 'emp']= df['ID'].value_counts().values - 不,这是错误的,仅在此数据中工作。
  • @AnubhavNegi - 在另一个答案中解释了什么问题
  • @jezrael 你好先生,你是对的,它只在这个数据中工作,但是 OP 先生想要改变 cond 满足的值......请先生看看 OP 的预期输出跨度>
  • @AnuragDabas - 将数据 a 更改为 cdf.loc[~df.duplicated(keep='first', subset=['ID']), 'emp']= df['ID'].value_counts().values 失败
  • @AnubhavNegi 查看您的预期输出
【解决方案2】:

这是df['ID'].value_counts() 的问题输出是Series,计数值在不同数量的值中,如原始数据,对于由计算机值填充的新列,使用Series.map

df.loc[~df.duplicated(subset=['ID']), 'emp'] = df['ID'].map(df['ID'].value_counts())

GroupBy.transformsize

df.loc[~df.duplicated(subset=['ID']), 'emp'] = df.groupby('ID')['ID'].transform('size')

具有 4 个值的输出系列无法分配回,因为 df1.indexdf['ID'].value_counts().index 中的索引不同

print (df['ID'].value_counts())
a    4
b    3
c    3
d    1
Name: ID, dtype: int64

如果转换为numpy数组只分配前4个值,因为在这个DataFrame中有4组a,b,c,d,所以df.duplicated(subset=['ID'])返回了4次Trues,但是为了4,3,3,1输出错误的原因是什么:

print (df['ID'].value_counts().values)
[4 3 3 1]

需要什么 - 具有相同 df.index 的新列 (Series):

print (df['ID'].map(df['ID'].value_counts()))
0     4
1     4
2     3
3     4
4     3
5     3
6     3
7     4
8     3
9     3
10    1
Name: ID, dtype: int64

print (df.groupby('ID')['ID'].transform('size'))
0     4
1     4
2     3
3     4
4     3
5     3
6     3
7     4
8     3
9     3
10    1
Name: ID, dtype: int64

【讨论】:

  • 感谢您如此详尽的解释,它帮助我学到了很多东西。这也有效。非常感谢
  • @AnubhavNegi - 也接受另一个答案,请不要使用df.loc[~df.duplicated(keep='first', subset=['ID']), 'emp']= df['ID'].value_counts().values,因为错误。
猜你喜欢
  • 2018-02-24
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2021-10-28
  • 2018-11-11
  • 1970-01-01
相关资源
最近更新 更多