![](/img/trans.png)
[英]how to apply a user defined function column wise on grouped data in pandas
[英]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.