我有一个看起来像这样的数据框:
1 2
a_value 2 8
a_ref 4 2
b_value 6 10
b_ref 3 15
c_value 7 3
请注意,某些索引是name_value
和name_ref
对,而其他索引则不是
我想找到这些对,并且对于每对在我的新数据框中得到四行:name_value
,name_ref
,name_ref/name_value
,name_value/name_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
我目前通过迭代索引寻找以value
结尾的索引,然后尝试找到匹配的ref
来做,但是知道熊猫,似乎应该有一个更简单的方法,也许以某种方式使用groupby。那么..有吗?
答案 0 :(得分:1)
这可能不是最优雅的解决方案,但它确实有效。首先,让我们找到公共密钥:
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