我想通过匹配它们的名称来划分2个df。例如,
df1 = pd.DataFrame({'Name':['xy-yz','xa-ab','yz-ijk','zb-ijk'],1:[1,2,3,4],2:[1,2,1,2],3:[2,2,2,2]} )
df2 = pd.DataFrame({'Name2':['x','y','z','a'],1:[0,1,2,3],2:[1,2,3,4],3:[5,5,5,6]})
df1:
Name1 1 2 3
xy-yz 1 1 2
xa-ab 2 2 2
yz-ijk 3 1 2
zb-ijk 4 2 2
df2:
Name2 1 2 3
x 0 1 5
y 1 2 5
z 2 3 5
a 3 4 6
结果将为df3:
Name1 1 2 3
xy-yz 1 1 2
x 0 1 5
xy-yz 1 .4 <---(xy-yz)/x
xa-ab 2 2 2
x 0 1 5
xa-ab 2 .4 <---(xa-ab)/x
yz-ijk 3 1 2
y 1 2 5
yz-ijk 3 .5 .4 <---(yz-ijk)/y
zb-ijk 4 2 2
z 2 3 5
zb-ijk 2 .67 .4 <---(zb-ijk)/z
我将使用concat,但是我不确定如何通过将Name2映射到Name1的第一个字母来进行除法。
谢谢!
建立 -
df1 = df1.set_index('Name')
df2 = df2.set_index('Name2')
df1
1 2 3
Name
xy-yz 1 1 2
xa-ab 2 2 2
yz-ijk 3 1 2
zb-ijk 4 2 2
df2
1 2 3
Name2
x 0 1 5
y 1 2 5
z 2 3 5
a 3 4 6
df2
根据的第一个字母检索相关行df1
。
i = df2.loc[df1.index.str[0]]
i
1 2 3
Name2
x 0 1 5
x 0 1 5
y 1 2 5
z 2 3 5
执行除法并重置索引。
j = (df1.set_index(i.index) / i).set_index(df1.index)
j
1 2 3
Name
xy-yz inf 1.000000 0.4
xa-ab inf 2.000000 0.4
yz-ijk 3.000000 0.500000 0.4
zb-ijk 2.000000 0.666667 0.4
连接结果。
pd.concat([df1, i, j])
1 2 3
xy-yz 1.000000 1.000000 2.0
xa-ab 2.000000 2.000000 2.0
yz-ijk 3.000000 1.000000 2.0
zb-ijk 4.000000 2.000000 2.0
x 0.000000 1.000000 5.0
x 0.000000 1.000000 5.0
y 1.000000 2.000000 5.0
z 2.000000 3.000000 5.0
xy-yz inf 1.000000 0.4
xa-ab inf 2.000000 0.4
yz-ijk 3.000000 0.500000 0.4
zb-ijk 2.000000 0.666667 0.4
如果要屏蔽非实数值,请np.isfinite
在此处再次使用j
on-
j = j[np.isfinite(j)].fillna('')
j
1 2 3
Name
xy-yz 1.000000 0.4
xa-ab 2.000000 0.4
yz-ijk 3 0.500000 0.4
zb-ijk 2 0.666667 0.4
使用这个 j
作为参数来串联之后。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句