python - 在分组数据中搜索信息并将其传播到组
问题描述
我有一个难题。
我的数据有一个 ID、一个分组键、一个标签和第二个标签。看起来有点像这样
|----|----------|-------|------|
|id |group_col |label1 |label2|
|--- |----------|-------|------|
|1 | 1 | abcd | 123 |
|2 | 1 | nfrv | 123 |
|3 | 2 | dfgd | |
|4 | 3 | kgff | 899 |
|5 | 3 | kgff | 899 |
|6 | 3 | ygoi | |
|7 | 4 | tgfo | |
|8 | 4 | tgfo | |
|----|----------|-------|------|
现在我的挑战是在每个组中检查两个人是否具有相同的 label2 值,如果是,则将其传播给该组的所有成员。并且另外为整个组(最好是第一个人)设置相同的 label1 值(如果人们有想法,也可以在新列中)。
预期的输出应该是这样的:
|----|----------|-------|------|------------|
|id |group_col |label1 |label2| label1_new |
|--- |----------|-------|------|------------|
|1 | 1 | abcd | 123 | abcd |
|2 | 1 | abcd | 123 | abcd |
|3 | 2 | dfgd | | dfgd |
|4 | 3 | kgff | 899 | kgff |
|5 | 3 | kgff | 899 | kgff |
|6 | 3 | ygoi | 899 | kgff |
|7 | 4 | tgfo | | tgfo |
|8 | 4 | tgfo | | tgfo |
|----|----------|-------|------|------------|
另外请注意,这将必须在数百万行/组上运行,因此应该尽可能高效
谢谢你的帮助
解决方案
实际上,我之前有点脑电波,并想出了一个可能的解决方案。还没有在大型数据喷气机上测试过,也没有清理过(稍后会这样做)。但如果有人有更好的方法,我很想听听。
df = pd.DataFrame(np.array([[1,1,'abcd',123],
[2,1,'nfrv',123],
[3,2,'dfgd',''],
[4,3,'kgff',899],
[5,3,'kgff',899],
[6,3,'ygoi',''],
[7,4,'tgfo',''],
[8,4,'tgfo',''],
[9,5,'etre',588],
[10,5,'etre',743],
[11,5,'dsfe',743]
]),
columns=['id','group_col','label1','label2']
)
def GroupComparison(df, ID,group_col, label1, label2 ):
oppdatert=[]
for group in df.group_col.drop_duplicates():
g = df.loc[df.group_col == group]
if g.label2.nunique()<g.id.count():
npers = g.id.count()
g = g.reset_index().drop('index', axis=1)
var1 = g.iloc[[0]]['label1']
var2 = g.iloc[[0]]['label2']
g['label1']= var1
g['label2']= var2
g=g.fillna(method = 'ffill')
oppdatert.append(g)
opp = pd.concat(oppdatert)
return opp
test = GroupComparison(df, 'id', 'group_col', 'label1', 'label2' )
test.head(11)
推荐阅读
- java - 如何更新 SQLite 中单行的多个列?
- python-3.x - type.__call__ 如何知道其结果的类型?
- javascript - ECMAScript 模块与对象作为命名空间
- android - 字符串参数未从本地通知发送到活动
- python - 为什么这段代码会执行 closed[init[0]][init[1]] 而不是 closed[init[0]][init[0]]?
- azure - C# 等效于 Get-AzEventHubNamespaceKey
- docker - 无法从远程 Linux 机器连接到 docker
- azure-devops - Azure DevOps 每晚构建 - 计划 \ cron 语法
- linq - 当前不支持方法“System.Linq.Queryable.TakeLast”的这种重载
- python - 将带有反斜杠后跟数字的字符串转换为路径