从具有不同索引的另一个数据框值创建多索引数据框

Creating a multiindexed dataframe from other dataframe values with different indicies

我有一个由多个文件组成的数据框 (dfA)。 dfA 具有三项内容,一个与 dfA 中的其他日期值匹配的日期值,一个来自未知数量名称列表的名称,该名称将与 dfA 中的其他名称相同,以及一个唯一的浓度值。我想创建一个新的数据框 (dfB),其中行按日期进行多索引,列是名称,值是所述名称值的浓度。我尝试使用以下代码执行此操作:

for name in nameList:
    dfB[str(name)] = dfA[dfA['Sample Name'] == str(name)]['Calculated Concentration']

但是,我返回了一个数据框,其中只有第一行被填充,我认为这是由于索引值与其他列值的索引值不同:

              '5/0.5 uM'  '10/1 uM'  '15/1.5 uM'
 083021 14     4.7886      NaN        NaN
        15     4.5374      NaN        NaN 
        ... 
 090721 14     5.2840      NaN        NaN
        15     5.3050      NaN        NaN
        ...
 083121 57     5.2132      NaN        NaN
        58     4.8929      NaN        NaN
        ...

在上面的输出中,最左边的列是按日期排列的值的多索引列。下一列包含原始 dfA 的索引。然后“5/0.5 uM”是来自 'name list' 的值,它包含从原始 dfA 中找到的值 'Sample Name'“5/0.5 uM”。

如何在其他列具有正确值的情况下创建 dfB,或者如何更改 dfA 中的索引值以匹配每列?

您可能会发现将日期重新格式化为日期时间变量而不是字符串更容易。话虽如此,设置测试:

dfA = pd.DataFrame({
    "date":["090721","083021","090721","083021","083121","083021","083121","083021","083121","083121"], 
    "name":["15/1.5 uM","15/1.5 uM","15/1.5 uM","15/1.5 uM","5/0.5 uM","5/0.5 uM","15/1.5 uM","5/0.5 uM","10/1 uM","10/1 uM"],
    "concentration":[0.430896003263987,0.354506173988912,0.679630142573769,0.816498937365697,0.134105578748551,0.364977945903234,0.602557291467607,0.633223692609049,2.59697726598929E-02,0.206455687221982]
})
dfA["index"] = dfA.index # copy index over to a column called index, for reasons that will be clearer soon.
dfA

请注意,(日期、姓名)的每个组合不一定都有一行。要获得您所描述的内容:

pd.pivot_table(dfA, values="concentration", index=["date", "index"], columns=["name"],aggfunc=np.mean)

输出:

您可以看到有 NaN 个。如前所述,这些对应于起始数据帧中的“间隙”。请注意,我们使用了聚合函数 np.mean,但这没有任何区别,因为我们选择了重新索引,这样每一行中只有一个集中值可以“聚合”。

您并没有要求这样做,但您可能还会发现对具有相同日期和名称的行取平均值很有用?只需从多索引规范中删除“索引”:

pd.pivot_table(dfA, values="concentration", index=["date"], columns=["name"],aggfunc=np.mean)

输出: