取决于列组的列内抽象值

问题描述 投票:0回答:1

我有以下数据框架,大约有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小时时间点后的%值从2小时时间点。我已经尝试了几个解决方案,通常最终在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

谢谢你的帮助!

pandas subtraction
1个回答
0
投票

我为你的表格中的两个不同的 "堆栈 "创建了一个唯一的标识符,然后用这个标识符作为一个 "堆栈"。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"]

可能还有更短更聪明的方法 但这个可能更有指导意义。

EDIT:

为了解决数据缺失的问题,你可以选择 how='outer',它将填补缺失值的NaN,然后使用

df3 = df3.fillna(0.0)

减法前

© www.soinside.com 2019 - 2024. All rights reserved.