簡體   English   中英

使用 pandas 數據幀中的 null 值按行分組

[英]Group by rows with null values in pandas data frame

檢測到的文本 信心 圖像名稱 參考 all_text
紐約市 73.215164 14.JPEG
9:36 91.633514 14.JPEG
MICKEYD19 89.422897 14.JPEG
ln 59.588081 14.JPEG
成人 98.488983 14.JPEG 9b01dc1e
ln 59.588081 15.JPEG
成人 98.488983 15.JPEG

這就是我的 dataframe 的樣子,並希望通過IMAGE_NAME將行組合為一個,並將DETECTEDTEXT的內容合並到ALL_TEXT並保留REF ,其中REF具有非空值和相應的CONFIDENCE行。 如果相同的圖像 (15.jpeg) 在REF列中具有所有 null 值,則要將DETECTEDTEXT合並到ALL_TEXT中,請將CONFIDENCE更改為 Null。

預期結果:

信心 圖像名稱 參考 全部文本
98.488983 14.JPEG 9b01dc1e INY 9:36 MICKEYD19 Ln 成人
15.JPEG 成人

我嘗試單獨使用 groupby 來滿足我的每個要求,但我得到的錯誤是 `TypeError: sequence item 0: expected string, int found

請試試:

選項1:

df1 = df.sort_values(['IMAGE_NAME','REF'], ascending=False)
df1 = df1.groupby('IMAGE_NAME').agg({'DETECTEDTEXT' : ' '.join , 'REF': 'last','CONFIDENCE':'last'}).reset_index()[['IMAGE_NAME','REF','CONFIDENCE','DETECTEDTEXT']]
df1.loc[df1['REF'].isnull(), 'CONFIDENCE'] = np.NaN
df1.rename(columns={'DETECTEDTEXT':'ALL_TEXT'},inplace=True)

選項#2

df1 = df.fillna('0')
df1 = df1.groupby('IMAGE_NAME').agg({'DETECTEDTEXT' : ' '.join , 'REF': 'max'}).reset_index()
df1 = df1.merge(df,on=['IMAGE_NAME','REF'], how='left')[['IMAGE_NAME','REF','CONFIDENCE','DETECTEDTEXT_x']]
df1 = df1.rename(columns={'DETECTEDTEXT_x' : 'ALL_TEXT'})
df1['REF'] = df1.REF.replace('0',np.NaN)

兩種打印:

  IMAGE_NAME       REF  CONFIDENCE                     ALL_TEXT
0    14.jpeg  9b01dc1e   98.488983  INY 9:36 MICKEYD19 Ln ADULT
1    15.jpeg       NaN         NaN                     Ln ADULT

輸入 df:

  DETECTEDTEXT  CONFIDENCE IMAGE_NAME       REF  ALL_TEXT
0          INY   73.215164    14.jpeg       NaN       NaN
1         9:36   91.633514    14.jpeg       NaN       NaN
2    MICKEYD19   89.422897    14.jpeg       NaN       NaN
3           Ln   59.588081    14.jpeg       NaN       NaN
4        ADULT   98.488983    14.jpeg  9b01dc1e       NaN
5           Ln   59.588081    15.jpeg       NaN       NaN
6        ADULT   98.488983    15.jpeg       NaN       NaN

Option#1 : Option#1 更優雅,是在我寫完 Option#2 之后出現的。 只需對 IMAGE_NAMe & 'REF' 組合進行排序並使用groupby

選項#2 :首先將所有 NaN 替換為零以便於計算,使用 'REF' 的groupby 'REF': 'MAX為 14.jpeg 返回 9b01dc1e,為 15.jpeg 返回 0。 現在使用pd.merge ,選擇與這些 REF 值對應的“置信度”分數。 對於 14.jpeg,它從原始 df 返回 9b01dc1e 的正確匹配,對於 15.jpeg,它返回 NaN,因為原始 df 中沒有匹配 0。 所以我們得到了所需的輸入。

注意:如果同一圖像可以有多個非 null REF 值,則代碼可能需要進行一些更改。 如果是這樣,我們可能還需要做一些其他的預處理。 除此之外,這應該有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM