pandas 数据框重复值计数无法正常工作
pandas dataframe duplicate values count not properly working
值计数为: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。
仅此一项就可以为给定的示例数据帧提供 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['ID'].value_counts()
的问题输出是 Series
与原始数据不同数量的计数值,对于由 couter 值填充的新列使用 Series.map
:
df.loc[~df.duplicated(subset=['ID']), 'emp'] = df['ID'].map(df['ID'].value_counts())
或 GroupBy.transform
与 size
:
df.loc[~df.duplicated(subset=['ID']), 'emp'] = df.groupby('ID')['ID'].transform('size')
具有 4 个值的输出系列无法分配回去,因为 df1.index
和 df['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次True
s,但是为了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
值计数为: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。
仅此一项就可以为给定的示例数据帧提供 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['ID'].value_counts()
的问题输出是 Series
与原始数据不同数量的计数值,对于由 couter 值填充的新列使用 Series.map
:
df.loc[~df.duplicated(subset=['ID']), 'emp'] = df['ID'].map(df['ID'].value_counts())
或 GroupBy.transform
与 size
:
df.loc[~df.duplicated(subset=['ID']), 'emp'] = df.groupby('ID')['ID'].transform('size')
具有 4 个值的输出系列无法分配回去,因为 df1.index
和 df['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次True
s,但是为了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