pandas - 根据列组减去列中的值
问题描述
我有以下包含大约 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,在其中我从 2h 时间点减去 20 h 时间点后的 % 值。我尝试了几种解决方案,通常以 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)
减法前
推荐阅读
- complex-event-processing - 使用 CEP 在几秒钟后未发生事件时触发
- node.js - 使用 IdentityServer4 在标头中传递访问和刷新令牌
- db2 - DB2 查询多选并按日期求和
- python - pandas 计算组的列值均值和整个数据帧的均值
- python - Pandas Dataframe 一次将一行追加到 CSV
- javascript - FadeIN FadeOUT 页面转换 javascript bug
- php - PHP:避免在写入文件时为多行字符串自动添加换行符
- android - 如何使用 Gson 解析包含数组的 JSON 文件
- typo3 - 您如何调试/跟踪 Fluid 中的问题?
- excel - Excel VBA - 在所有工作表中搜索同一列,查找任何数据