Python 按公共名称划分数据帧行对

Python 按公共名称划分数据帧行对,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个数据框,看起来像: 1 2 a_value 2 8 a_ref 4 2 b_value 6 10 b_ref 3 15 c_value 7 3 请注意,有些索引是成对的name\u value和name\u ref,而其他索引则不是 我想找到这些对,在我的新数据框中为每对找到四行:name\u value,name\u ref,name\u ref/name\u value,name\u value/name\u ref,所以我的

我有一个数据框,看起来像:

         1   2
a_value  2   8
a_ref    4   2
b_value  6  10
b_ref    3  15
c_value  7   3
请注意,有些索引是成对的
name\u value
name\u ref
,而其他索引则不是

我想找到这些对,在我的新数据框中为每对找到四行:
name\u value
name\u ref
name\u ref/name\u value
name\u value/name\u ref
,所以我的输出数据框如下所示:

                 1       2
a_value        2.0   8.000
a_ref          4.0   2.000
a_value/a_ref  0.5   4.000
a_ref/a_value  2.0   0.250
b_value        6.0  10.000
b_ref          3.0  15.000
b_value/b_ref  2.0   0.666
b_ref/b_value  0.5   1.500

目前,我通过迭代索引来查找以
值结尾的索引,然后尝试查找匹配的
ref
,但了解熊猫,似乎应该有一种更简单的方法,也许可以使用groupby。所以有吗?

这可能不是最优雅的解决方案,但它确实有效。首先,让我们查找常用键:

import numpy as np
keys = np.intersect1d(df.index.str.extract("(.+)_value").dropna(),
                      df.index.str.extract("(.+)_ref").dropna())
#array(['a', 'b'], dtype=object)
接下来,选择匹配的参照和值:

refs   = df.loc[keys + "_ref"]
values = df.loc[keys  +"_value"]
制作每个数据帧的副本,并将键作为索引分配给它们:

values1 = values.copy()
values1.index = keys
refs1 = refs.copy()
refs1.index = keys
执行除法并再次更新索引:

ratios = values1 / refs1
ratios.index += "_value" + "/" + ratios.index + "_ref"
ratios1 = refs1 / values1
ratios1.index += "_ref" + "/" + ratios1.index + "_value"
把所有东西放在一起分类:

pd.concat([refs, values, ratios, ratios1]).sort_index()
#                 1          2
#a_ref          4.0   2.000000
#a_ref/a_value  2.0   0.250000
#a_value        2.0   8.000000
#a_value/a_ref  0.5   4.000000
#b_ref          3.0  15.000000
#b_ref/b_value  0.5   1.500000
#b_value        6.0  10.000000
#b_value/b_ref  2.0   0.666667

什么是
name\u value
name\u ref
?索引(单词
name
是一个占位符,例如一对是索引为
a\u value
的行和索引为
a\u ref
)的行。不要使用
ix
,因为已弃用。:)看起来不错,谢谢。我将稍等片刻,看看是否有更优雅的解决方案,如果没有,请标记您的解决方案。请注意,
ix
已被弃用,因此最好使用
loc