Python 熊猫分部和2个dfs
我想通过匹配两个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
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
onj
如果您想屏蔽非实数值-
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
onj
如果您想屏蔽非实数值-
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?@TylerNGdf1.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?@TylerNGdf1.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')