我有一个看起来像这样的数据框
ID ..... config_name config_version ...
aa A 0
ab A 7
ad A 7
ad A 27
bb B 0
cc C 0
cd C 8
我想对config_name进行分组并在每个唯一的config_version上应用cumcount,以便获得诸如
的附加列 ID ..... config_name config_version config_version_count
aa A 0 0
ab A 7 1
ad A 7 1
ad A 27 2
bb B 0 0
cc C 0 0
cd C 8 1
但是我似乎不明白该怎么做。
我尝试使用
unique_count = df.groupby('config_name')['config_version'].cumcount()
unique_count = pd.DataFrame({'config_name': [unique_count.index], 'config_version_count: [unique.count.values]})
df = pd.merge(df,unique_count, on = 'config_name' , how = 'left')
哪个给出以下输出
ID ..... config_name config_version config_version_count
aa A 0 0
ab A 7 1
ad A 7 2
ad A 27 3
bb B 0 0
cc C 0 0
cd C 8 1
我也尝试过
unique_count = df.drop_duplicates().groupby('config_name')['config_version'].cumcount()
unique_count.reindex(df.index).ffill()
df['config_version_count'] = unique_count
但这给出了与第一次尝试相同的输出。
知道我该怎么做吗?
答案 0 :(得分:4)
将CategoricalIndex
与CategoricalIndex.codes
一起使用:
df['config_version_count'] = (df.groupby('config_name')['config_version']
.transform(lambda x: pd.CategoricalIndex(x).codes))
print (df)
ID config_name config_version config_version_count
0 aa A 0 0
1 ab A 7 1
2 ad A 7 1
3 ad A 27 2
4 bb B 0 0
5 cc C 0 0
6 cd C 8 1
您的解决方案应该可以正常工作
df['config_version_count'] = (df.drop_duplicates(['config_name','config_version'])
.groupby('config_name')
.cumcount())
df['config_version_count'] = df['config_version_count'].ffill().astype(int)
答案 1 :(得分:1)
df['config_version_count']=df.groupby('config_name')['config_version'].\
transform(lambda x: pd.factorize(x)[0])
print(df)
ID config_name config_version config_version_count
0 aa A 0 0
1 ab A 7 1
2 ad A 7 1
3 ad A 27 2
4 bb B 0 0
5 cc C 0 0
6 cd C 8 1