我有一些数据帧,其中数据被分组标记,让我们这样说:
df1 = pd.DataFrame({'id':[1,3,7, 10,30, 70, 100, 300], 'name':[1,1,1,1,1,1,1,1], 'tag': [1,1,1, 2,2,2, 3,3]})
df2 = pd.DataFrame({'id':[2,5,6, 20, 50, 200, 500, 600], 'name': [2,2,2,2,2,2,2,2], 'tag':[1,1,1, 2, 2, 3,3,3]})
df3 = pd.DataFrame({'id':[4, 8, 9, 40, 400, 800, 900], 'name': [3,3,3,3,3,3,3], 'tag':[1,1,1, 2, 3, 3,3]})
在每个数据帧中,标签按 id 的升序排列(因此更大的 id 将具有相等或更大的标签)。我的愿望是重新计算连接数据框中的标签,
df = pd.concat([df1, df2, df3])
这样每个组的标签将按每个组的第一个元素的 id 升序排列。所以,id=1开始的组会被标记为1(即ids 1,3,7),id=2开始的组会被标记为2(即ids 2,5,6),从 4 开始的组将被标记为 3,从 10 开始的组将被标记为 4,依此类推。
我确实设法得到了一个(复杂的!)解决方案:
1) 获取每组的第一行,将它们放入数据框中,按 id 排序并创建新标签:
dff = pd.concat([df1.groupby('tag').first(), df2.groupby('tag').first(), df3.groupby('tag').first()])
dff = dff.sort(['id'])
dff = dff.reset_index()
dff['new_tags'] = dff.index +1
2) 将此数据框与初始数据框 drop_duplicates 连接起来,以保留新标记的行,按组排序,然后传播新标记:
df = pd.concat([dff, df1, df2, df3])
df = df.drop_duplicates(subset=['id', 'tag', 'name'])
df = df.sort(['name', 'tag'])
df = df.fillna(method = 'pad')
新标签正是需要的,但我的解决方案似乎太复杂了。你有什么关于如何更容易的建议吗?我想我一定是错过了什么!
慕森卡
青春有我
相关分类