[英]Pandas Group Data and Aggregate Variables and Find Duplicates
我有以下数据:
plate,part,posX,posY,rotation
1,FSHN01-R-58.stl,14.5,9.5,180
1,FSHN01-R-58.stl,14.5,9.5,180
1,FSHN01-E-2.stl,44.5,6.5,270
1,FSHN01-N-3.stl,88,7,0
2,FSHN01-N-7.stl,70.5,70.5,90
2,FSHN01-N-1.stl,128.5,64.5,180
2,FSHN01-N-1.stl,113.5,69.5,90
7,FSHN01-R-58.stl,14.5,9.5,180
7,FSHN01-R-58.stl,14.5,9.5,180
7,FSHN01-E-2.stl,44.5,6.5,270
7,FSHN01-N-3.stl,88,7,0
我想按部分对盘子进行分组并找到相同的盘子。 例如,在此数据上,1,7 具有相同的部分。 posX、posY、旋转对我来说并不重要,我需要找到每个板的零件数量。
为此,我写了这段代码:
import pandas as pd
df = pd.read_csv("public/33/stls/plates.csv")
result = df.groupby(['plate', 'part']).size()
print(result)
我得到了。
plate part
1 FSHN01-E-2.stl 1
FSHN01-N-3.stl 1
FSHN01-R-58.stl 2
2 FSHN01-N-1.stl 2
FSHN01-N-7.stl 1
7 FSHN01-E-2.stl 1
FSHN01-N-3.stl 1
FSHN01-R-58.stl 2
所以,1. 和 7. plates 是一样的,我怎样才能从表中删除 7. plate 并增加 1. plate plate count 变量。
我需要这个结果;
plate part part count plate count
1 FSHN01-E-2.stl 1 2
FSHN01-N-3.stl 1 2
FSHN01-R-58.stl 2 2
2 FSHN01-N-1.stl 2 1
FSHN01-N-7.stl 1 1
IIUC,您需要两个groupby
,一个带有默认的板/零件,一个在其中将板值 7 替换为 1:
synonyms = {7: 1}
(df.groupby(['plate', 'part']).size().to_frame(name='part_count')
.join(df.assign(plate2=df['plate'].replace(synonyms))
.groupby(['plate2', 'part'])['plate'].agg(plate_count='nunique')
.rename_axis(['plate', 'part']),
how='inner'
)
.reset_index()
)
或者更线性的形式:
synonyms = {7: 1}
df2 = df.groupby(['plate', 'part']).size().to_frame(name='part_count')
df2['plate_count'] = (df.assign(plate2=df['plate'].replace(synonyms))
.groupby(['plate2', 'part'])['plate'].nunique()
)
df2 = df2.dropna().reset_index()
output:
plate part part_count plate_count
0 1 FSHN01-E-2.stl 1 2
1 1 FSHN01-N-3.stl 1 2
2 1 FSHN01-R-58.stl 2 2
3 2 FSHN01-N-1.stl 2 1
4 2 FSHN01-N-7.stl 1 1
注意。 请注意,您在这里自愿丢失了板 7 的零件计数信息。 如果你想保留它,map 7比1如上图并执行单个GroupBy.agg
import pandas as pd
df = pd.read_csv("plates.csv")
df = df.groupby(['plate', 'part']).size().reset_index(name='count')
df_dict = df.groupby('plate')[['part', 'count']].apply(lambda x: x.to_dict('records')).to_dict()
result, plate_count = {}, {}
for key, value in df_dict.items():
if value not in result.values():
result[key] = value
plate_count[key] = 1
else:
plate_count[list(result.keys())[list(result.values()).index(value)]] += 1
print(result)
print(plate_count)
和我得到的 output:
{1: [{'part': 'FSHN01-E-2.stl', 'count': 1}, {'part': 'FSHN01-N-3.stl', 'count': 1}, {'part': 'FSHN01-R-58.stl', 'count': 2}], 2: [{'part': 'FSHN01-N-1.stl', 'count': 2}, {'part': 'FSHN01-N-7.stl', 'count': 1}]}
{1: 2, 2: 1}
我找到了解决此问题的方法,但我无法解决 pandas 的问题,我使用了 dict。 我想知道更好的方法,任何人都可以找到它吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.