Python 熊猫分部和2个dfs

Python 熊猫分部和2个dfs,python,pandas,dataframe,division,Python,Pandas,Dataframe,Division,我想通过匹配两个dfs的名称来划分它们。比如说, 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,6]}) df1: df2: 结果将是df3: Name1 1 2 3 xy-yz

我想通过匹配两个dfs的名称来划分它们。比如说,

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,6]})

df1:

df2:

结果将是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
name123
xy yz 1 2
x15

xy yz 1.4我不知道你为什么需要它,但这会回报你所需要的

df2=df2.set_index('Name2')
dfNew=df2.reindex(df1.Name1.str.split('-',expand=True)[0])
df1=df1.set_index('Name1')
pd.concat([df1.reset_index(),dfNew.reset_index().rename(columns={0:'Name1'}),pd.DataFrame(df1.values/dfNew.values,columns=df1.columns).assign(Name1=df1.index)]).sort_index()


Out[897]: 
          1         2    3  Name1
0  1.000000  1.000000  2.0   x-yz
0  0.000000  1.000000  5.0      x
0       inf  1.000000  0.4   x-yz
1  2.000000  2.000000  2.0   x-ab
1  0.000000  1.000000  5.0      x
1       inf  2.000000  0.4   x-ab
2  3.000000  1.000000  2.0  y-ijk
2  1.000000  2.000000  5.0      y
2  3.000000  0.500000  0.4  y-ijk
3  4.000000  2.000000  2.0  z-ijk
3  2.000000  3.000000  5.0      z
3  2.000000  0.666667  0.4  z-ijk

我不知道你为什么需要它,但这会回报你所需要的

df2=df2.set_index('Name2')
dfNew=df2.reindex(df1.Name1.str.split('-',expand=True)[0])
df1=df1.set_index('Name1')
pd.concat([df1.reset_index(),dfNew.reset_index().rename(columns={0:'Name1'}),pd.DataFrame(df1.values/dfNew.values,columns=df1.columns).assign(Name1=df1.index)]).sort_index()


Out[897]: 
          1         2    3  Name1
0  1.000000  1.000000  2.0   x-yz
0  0.000000  1.000000  5.0      x
0       inf  1.000000  0.4   x-yz
1  2.000000  2.000000  2.0   x-ab
1  0.000000  1.000000  5.0      x
1       inf  2.000000  0.4   x-ab
2  3.000000  1.000000  2.0  y-ijk
2  1.000000  2.000000  5.0      y
2  3.000000  0.500000  0.4  y-ijk
3  4.000000  2.000000  2.0  z-ijk
3  2.000000  3.000000  5.0      z
3  2.000000  0.666667  0.4  z-ijk
设置-

df1 = df1.set_index('Name')
df2 = df2.set_index('Name2')
根据
df1
的第一个字母从
df2
中检索相关行

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
on
j
如果您想屏蔽非实数值-

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
作为后面连接的参数。

设置-

df1 = df1.set_index('Name')
df2 = df2.set_index('Name2')
根据
df1
的第一个字母从
df2
中检索相关行

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
on
j
如果您想屏蔽非实数值-

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
作为后面连接的参数。

执行除法非常简单。挑战在于您拥有的这种奇怪的输出表示;-)@Cᴏʟᴅsᴘᴇᴇᴅ 它不必是那种格式。我会在那里使用concat(df1,df2,division)。我这样安排是为了让每个人都更容易理解逻辑。除法很容易。挑战在于您拥有的这种奇怪的输出表示;-)@Cᴏʟᴅsᴘᴇᴇᴅ 它不必是那种格式。我会在那里使用concat(df1,df2,division)。我这样安排是为了让每个人都更容易理解逻辑。只需稍作调整,而不是df1.index.str[0],我们可以搜索到“-”吗?例如,对于xyz-abc,如果我们使用df1.index.str[0]我们将得到x,那么如何得到完整的zyz?@TylerNG
df1.index.str.split('-').str[0]
?@TylerNG好的,我想其中一条语句应该改为
df2.loc[df1.index.str.split('-').str[0].str.strip()
@TylerNG,请记住,更改数据/问题会使答案无效,因此请尽量不要经常这样做:-)opp我不知道这一点。我尝试了I=df2.loc[df1.index.str.split('-').str[0]],但是我一直得到“没有一个[index(['1','2','2'…dtype='object',name='Label')]在[index].”中。让我用我的实际数据来调整它。只是一些小的调整,而不是df1.index.str[0],我们能搜索到“-”吗?例如,对于xyz-abc,如果我们使用df1.index.str[0]我们将得到x,如何得到完整的zyz?@TylerNG
df1.index.str.split('-').str[0]
?@TylerNG好的,我想其中一条语句应该改为
df2.loc[df1.index.str.split('-').str[0].str.strip()
@TylerNG还有,请记住,更改数据/问题会使答案无效,所以请尽量不要经常这样做:-)Opps我不知道。我尝试了I=df2.loc[df1.index.str.split('-').str[0]],但我一直得到“索引(['1','2','2'…dtype='object',name='Label')]中没有一个在[index]”。让我用我的实际数据来调整它。不确定为什么会出现错误:操作数不能与形状(4,10)(4,9)一起广播@TylerNG抱歉更新,忘记添加df1=df1。set_index('Name1')不确定为什么会出现错误:操作数不能与形状(4,10)(4,9)一起广播@TylerNG抱歉已更新,忘记添加df1=df1。设置索引('Name1')