在多个条件下合并 Pandas 数据帧

时间:2021-01-22 01:18:45

标签: python pandas

我正在尝试使用 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

2 个答案:

答案 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