我正在尝试使用 Pandas 在框架 B 中指定的资产寿命条件下将框架 A 合并到框架 B。我已经尝试了 merge 和 mergeasof 命令,但没有找到解决方案。
帧 A:
ID | 材料 | 尺寸 |
---|---|---|
0 | A | 9 |
1 | B | 21 |
2 | B | 14 |
框架 B:注(大小指定资产寿命)
材料 | 尺寸 <10 | 10 < 尺寸 < 20 | 尺寸 > 20 |
---|---|---|---|
A | 5 | 10 | 20 |
B | 1 | 5 | 10 |
形成框架C:
ID | 材料 | 资产寿命 |
---|---|---|
0 | A | 5 |
1 | B | 10 |
2 | B | 5 |
答案 0 :(得分:0)
第一步是规范化DataFrame B,最后得到以下内容:
Material,LoweBound,UpperBound,AssetLife
A,0,10,5
A,10,20,10
A,20,np.Inf,20
B,0,10,1
B,10,20,5
B,20,np.Inf,10
现在一个简单的连接应该可以解决问题。
答案 1 :(得分:0)
# step1: set_index('Material') and stack frameB
dfB.columns = ['Material', 'Size <= 10', '10 < Size <= 20', 'Size > 20']
obj_size_map = dfB.set_index('Material').stack()
# print(obj_size_map)
# Material
# A Size <= 10 5
# 10 < Size <= 20 10
# Size > 20 20
# B Size <= 10 1
# 10 < Size <= 20 5
# Size > 20 10
# dtype: int64
# step2. use pd.cut to create a size_tag for frame A, with frameB's columns as labels
dfA['size_tag'] = pd.cut(dfA.Size, bins=[-np.inf, 10, 20, np.inf], labels=dfB.columns[1:])
# print(dfA)
# ID Material Size size_tag
# 0 0 A 9 Size <= 10
# 1 1 B 21 Size > 20
# 2 2 B 14 10 < Size <= 20
# step3. use pandas DF's index to assign a new columns
dfC = dfA.set_index(['Material', 'tag'])
dfC['Asset Life'] = obj_size_map
# print(dfC)
# ID Size size_tag Asset Life
# Material tag
# A Size <= 10 0 9 Size <= 10 5
# B Size > 20 1 21 Size > 20 10
# 10 < Size <= 20 2 14 10 < Size <= 20 5
# step4. output
result = dfC.reset_index()[['ID', 'Material', 'Asset Life']]
# print(result)
# ID Material Asset Life
# 0 0 A 5
# 1 1 B 10
# 2 2 B 5