我有一个当前看起来像这样的数据框:
image source label
bookshelf A [flora, jar, plant]
bookshelf B [indoor, shelf, wall]
bookshelf C [furniture, shelf, shelving]
cactus A [flora, plant, vine]
cactus B [building, outdoor, tree]
cactus C [home, house, property]
cars A [parking, parking lot, vehicle]
cars B [car, outdoor, tree]
cars C [car, motor vehicle, vehicle]
我想得到的是每个image
每个source
的重复label
的计数,即:
- 对于
图像
书架,源B和C共享“书架”标签(B+=1 ;C+=1) - 对于
图像
仙人掌,没有来源共享相同的标签 - 对于
图像
汽车,来源B和C共享标签“car”(B+=1 ; C+=1),来源A和C共享标签“车辆”(A+=1; C+=1)
响应对象将是源共享标签的次数。在上面的示例中,(1) 会将 B 和 C 计数各增加 1,(3) 会将 B 和 < em>C 各计数 1,A 和 C 各计数 1:
{ 'A': 1, 'B': 2, 'C': 3 }
可重现的示例:
from pandas import DataFrame
df = DataFrame({
'image': ['bookshelf', 'bookshelf', 'bookshelf',
'cactus', 'cactus', 'cactus',
'cars', 'cars', 'cars'],
'source': ['A', 'B', 'C',
'A', 'B', 'C',
'A', 'B', 'C'],
'label': [
['flora', 'jar', 'plant'],
['indoor', 'shelf', 'wall'],
['furniture', 'shelf', 'shelving'],
['flora', 'plant', 'vine'],
['building', 'outdoor', 'tree'],
['home', 'house', 'property'],
['parking', 'parking lot', 'vehicle'],
['car', 'outdoor', 'tree'],
['car', 'motor vehicle', 'vehicle']]
},
columns = ['image', 'source', 'label']
)
虽然每个源/图像通常有 3 个标签,但这并不能保证。
关于如何以良好的性能实现这一目标,有什么想法吗?我有几百万条记录需要处理......
最佳答案
这应该可以完成工作:
from collections import Counter
sources = df['source'].unique()
output = {source: 0 for source in sources}
for image, sub_df in df.groupby('image'):
counts = Counter(sub_df['label'].sum())
for image, source, labels in sub_df.itertuples(index=False):
for label in labels:
output[source] += counts[label] - 1
print(output)
关于python - 按组计算 Pandas Dataframe 中列表的重复项计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55408337/