我有以下数据框架,大约有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
谢谢你的帮助!
我为你的表格中的两个不同的 "堆栈 "创建了一个唯一的标识符,然后用这个标识符作为一个 "堆栈"。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)
减法前