繁体   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