如何根据另一个数据帧的多索引的值应用数据帧中的值



>我有以下内容:

数据帧

1(多索引数据帧):

                             |      Assay_A       |
---------------------------------------------------
Index_A | Index_B | Index_C  | mean | std | count |
---------------------------------------------------
   128     12345      AAA      123    2     4

数据帧 2:

    Index | Col_A | Col_B | Col_C | mean
    -------------------------------------
      1      128    12345   AAA     456

其中 Col_X = a、b、c 的 Index_X。

我整个上午都在尝试做以下事情:

如何在数据帧 2 中选择正确的平均值(必须在 Col ABC 上匹配),以便我可以对其进行数学运算。例如,我想取数据帧 1 的平均值并将其除以正确选择的数据帧 2 的平均值。

理想情况下,我想将操作的结果存储在新列中。所以最终输出应该看起来像这样:

                             |            Assay_A          |
------------------------------------------------------------
Index_A | Index_B | Index_C  | mean | std | count | result |
------------------------------------------------------------
   128     12345      AAA      123    2     4       0.26

也许有一种更简单的方法可以做到这一点,我也愿意接受任何此类建议。

我建议您做的是 1) 将数据帧 2 的列重命名为数据帧 1 的索引列的

相应名称,2) 重置数据帧 1 上的索引,以及 3) 根据现在匹配的列名合并两个表。之后,您可以计算任何您喜欢的内容。数据帧 2 列上的 MultiIndex 增加了一些额外的开销。

明确地:

import pandas as pd
# re-create table1
row_index = pd.MultiIndex.from_tuples([(128, 12345, 'AAA')])
row_index.names=['Index_A', 'Index_B', 'Index_C']
table1 = pd.DataFrame(data={'mean': 123, 'std': 2, 'count': 4}, index=row_index)
table1.columns = pd.MultiIndex.from_tuples(zip(['Assay A'] * 3, table1.columns))
print "*** table 1:"
print table1
print ""
# re-create table2
table2 = pd.DataFrame([{'Col_A': 128, 'Col_B': 12345, 'Col_C': 'AAA', 'mean': 456}], index=[1])
table2.index.name = 'Index'
print "*** table 2:"
print table2
print ""
# re-name columns of table2 to match names of respective index columns in table1
table2 = table2.rename(columns={'Col_A': 'Index_A', 'Col_B': 'Index_B', 'Col_C': 'Index_C'})
# Drop 'Assay A' index level on columns of table1;
# without doing that, the following reset_index() will produce a column multi-index
# for Index_A/B/C, so column names will not match the simple column index of table2_renamed.
# If you need to keep the 'Assay A' level here, you will need to also construct a column
# multi-index for table2_renamed (with empty values for the second level).
table1.columns = table1.columns.levels[1]
# Move index columns of table1 back to regular columns
table1 = table1.reset_index()
# Merge the two tables on the now common column names. 'mean' appears in both tables,
# give the column from table2 a suffix '_2'.
joint = pd.merge(table1.reset_index(), table2, on=['Index_A', 'Index_B', 'Index_C'], suffixes={'', '_2'})
print "*** joint, before re-setting index:"
print joint
print ""
# Restore index of the joint table
joint = joint.set_index(['Index_A', 'Index_B', 'Index_C'])
# Compute the 'result'
joint['result'] = joint['mean'] / joint['mean_2']
# drop unused columns
joint = joint.drop(['index', 'mean_2'], axis=1)
# restore column index level
joint.columns = pd.MultiIndex.from_tuples(zip(['Assay A'] * 4, joint.columns))
print "*** final result:"
print joint
print ""

脚本输出为:

*** table 1:
                        Assay A         
                          count mean std
Index_A Index_B Index_C                 
128     12345   AAA           4  123   2
*** table 2:
       Col_A  Col_B Col_C  mean
Index                          
1        128  12345   AAA   456
*** joint, before re-setting index:
   index  Index_A  Index_B Index_C  count  mean  std  mean_2
0      0      128    12345     AAA      4   123    2     456
*** final result:
                        Assay A                   
                          count mean std    result
Index_A Index_B Index_C                           
128     12345   AAA           4  123   2  0.269737

希望对您有所帮助!

最新更新