簡體   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