繁体   English   中英

在 Pandas 列中的元素上应用 function,分组到另一列

[英]Apply a function on elements in a Pandas column, grouped on another column

我有一个包含几列的数据集。 现在我想要的是基本上根据特定列(“名称”)计算分数,但在“id”列上分组。

         _id      fName        lName    age
0       ABCD     Andrew       Schulz    
1       ABCD    Andreww                  23
2       DEFG       John          boy
3       DEFG      Johnn          boy     14
4       CDGH        Bob        TANNA     13
5       ABCD.     Peter        Parker    45
6       DEFGH     Clark          Kent    25

所以我正在寻找的是对于相同的 id,我是否获得了相似的条目,所以我可以根据阈值分数值删除这些条目。 如果我为 col“fName”运行它,就像这里一样。 我应该能够根据分数阈值将此 dataframe 减少到:

         _id      fName        lName   age
0       ABCD     Andrew       Schulz    23
2       DEFG       John          boy    14
4       CDGH        Bob        TANNA    13
5       ABCD      Peter       Parker    45
6       DEFG      Clark         Kent    25

我打算使用 pyjarowinkler。 如果我有两个独立的列(没有所有分组)要检查,这就是我使用它的方式。

    df['score'] = [distance.get_jaro_distance(x, y) for x, y in zip(df['name_1'],df['name_2'])]
    df = df[df['score'] > 0.87]

有人可以建议一种pythonic和快速的方法吗

更新

因此,我尝试为此使用记录链接库。 我最终得到了一个 dataframe ,其中包含一对相似的索引,称为“匹配”。 现在我只想基本合并数据。

index1   index2          fName
0           1             1.0
2           3             1.0

这是匹配的外观:

 index1 index2 fName 0 1 1.0 2 3 1.0

我需要有人建议一种方法来组合相似的行,以从相似的行中获取数据

只是想清除对您的问题的一些疑问。 由于声誉低,无法在评论中清除它们。

如果我为 col“fName”运行它,就像这里一样。 我应该能够根据分数阈值将此 dataframe 减少到:

所以基本上你的 function 会返回包含每个组中第一行的 DataFrame(按 ID)? 这将导致上面列出的结果 DataFrame。

         _id      fName        lName   age
0       ABCD     Andrew       Schulz    23
2       DEFG       John          boy    14
4       CDGH        Bob        TANNA    13

我希望这段代码能回答你的问题

r0 =['ABCD','Andrew','Schulz',  ''  ]
r1 =['ABCD','Andrew',   ''   , '23' ]
r2 =['DEFG','John'  ,'boy'   , ''   ]
r3 =['DEFG','John'  ,'boy'   , '14' ]
r4 =['CDGH','Bob'   ,'TANNA' , '13' ]

Rx =[r0,r1,r2,r3,r4]

print(Rx)
print()

Dict= dict()

for i in Rx:
    if (Dict.__contains__(i[0]) == True):
        if (i[2] != ''):
            Dict[i[0]][2] = i[2]
        if (i[3] != ''):
            Dict[i[0]][3] = i[3]
    else:
        Dict[i[0]]=i


Rx[:] = Dict.values()

print(Rx)

我对您问题的“分数”部分感到迷茫,但是如果您需要用其他行的值填充数据中的空白,然后按 id 删除重复项,也许这会有所帮助:

df.replace('', np.nan, inplace=True)
df_filled = df.fillna(method='bfill').drop_duplicates('Id', keep='first')

首先确保将空值替换为空值。 然后使用fillna来“回填”数据。 然后删除重复项,保留第一次出现的 Id。 fillna将从列中找到的下一个值填充值,该值可能对应于其他 Id,但由于您将丢弃重复的行,我相信drop_duplicates保持第一次出现将完成这项工作。 (这假设每个 Id 的每一列中至少提供一个值)

我已经用这个数据集和代码进行了测试:

data = [
    ['AABBCC', 'Andrew', '',],
    ['AABBCC', 'Andrew', 'Schulz'],
    ['AABBCC', 'Andrew', '', 23],
    ['AABBCC', 'Andrew', '',],
    ['AABBCC', 'Andrew', '',],
    ['DDEEFF', 'Karl', 'boy'],
    ['DDEEFF', 'Karl', ''],
    ['DDEEFF', 'Karl', '', 14],
    ['GGHHHH', 'John', 'TANNA', 13],
    ['HLHLHL', 'Bob', ''],
    ['HLHLHL', 'Bob', ''],
    ['HLHLHL', 'Bob', 'Blob'],
    ['HLHLHL', 'Bob', 'Blob', 15],
    ['HLHLHL', 'Bob','', 15],
    ['JLJLJL', 'Nick', 'Best', 20],
    ['JLJLJL', 'Nick', '']
]

df = pd.DataFrame(data, columns=['Id', 'fName', 'lName', 'Age'])

df.replace('', np.nan, inplace=True)
df_filled = df.fillna(method='bfill').drop_duplicates('Id', keep='first')

Output:

    Id      fName   lName   Age
0   AABBCC  Andrew  Schulz  23.0
5   DDEEFF  Karl    boy     14.0
8   GGHHHH  John    TANNA   13.0
9   HLHLHL  Bob     Blob    15.0
14  JLJLJL  Nick    Best    20.0

如果我误解了这个问题,希望这会有所帮助并道歉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM