根据列组减去列内的值

Substract Values within column dependent on column groups

我有以下包含大约 5000 个条目的数据框。

df = pd.DataFrame({'name':['Strain A', 'Strain B', 'Strain C', 'Strain A', 'Strain B', 'Strain C','Strain A', 'Strain B', 'Strain C','Strain A', 'Strain B', 'Strain C', 'Strain A', 'Strain B', 'Strain C','Strain A', 'Strain B',],
               'Buffer':['PBS', 'PBS', 'PBS', 'Tris', 'Tris', 'Tris', 'Phos','Phos','Phos','PBS', 'PBS', 'PBS', 'Tris', 'Tris', 'Tris', 'Phos','Phos'],
               'Time' :[2,2,2,2,2,2,2,2,2,20,20,20,20,20,20,20,20],
               '%':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
               }).set_index('name')



        Buffer  Time   %
name                     
Strain A  PBS    2     1 
Strain B  PBS    2     2 
Strain C  PBS    2     3 
Strain A  Tris   2     4 
Strain B  Tris   2     5 
Strain C  Tris   2     6 
Strain A  Phos   2     7 
Strain B  Phos   2     8 
Strain C  Phos   2     9 
Strain A  PBS    20    10
Strain B  PBS    20    11
Strain C  PBS    20    12
Strain A  Tris   20    13
Strain B  Tris   20    14
Strain C  Tris   20    15
Strain A  Phos   20    16
Strain B  Phos   20    17

我想创建一个新的 df,其中我从 % 的 20 小时时间点后的 2h 时间点减去 % 值。我尝试了几种解决方案,通常以 NaN 结尾 我想以类似这样的 df 结尾:

         Buffer  %
name              
Strain A  PBS    9
Strain B  PBS    9
Strain C  PBS    9
Strain A  Tris   9
Strain B  Tris   9
Strain C  Tris   9
Strain A  Phos   9
Strain B  Phos   9
Strain C  Phos  -9

感谢您的帮助!

我为您的 table 中的两个不同 'stacks' 创建了一个唯一标识符,然后将该标识符用作 merge 索引。 Pandas 将添加一个后缀以保持您的名字的唯一性。然后你可以执行一个简单的减法:

df = pd.DataFrame({'name':['Strain A', 'Strain B', 'Strain C', 'Strain A', 'Strain B', 'Strain C','Strain A', 'Strain B', 'Strain C','Strain A', 'Strain B', 'Strain C', 'Strain A', 'Strain B', 'Strain C','Strain A', 'Strain B',],
           'Buffer':['PBS', 'PBS', 'PBS', 'Tris', 'Tris', 'Tris', 'Phos','Phos','Phos','PBS', 'PBS', 'PBS', 'Tris', 'Tris', 'Tris', 'Phos','Phos'],
           'Time' :[2,2,2,2,2,2,2,2,2,20,20,20,20,20,20,20,20],
           '%':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
           }).set_index('name')


df["unique"] = df.index + "_" + df["Buffer"]
df1 = df[df["Time"]==2]
df2 = df[df["Time"]==20]

df3 = pd.merge(df1,df2,left_on='unique',right_on='unique',how='inner')
df3["Diff"] = df3["%_y"] - df3["%_x"]

可能有更短更聪明的方法,但这可能更有启发性。

编辑:

要计算缺失数据,您可以选择 how='outer',这将在存在缺失值的地方填充 NaN,然后​​使用

df3 = df3.fillna(0.0)

减法前