python - 将自定义函数应用于 pandas groupby 对象
问题描述
df1 = pd.DataFrame({'Chromosome': ['1A','1A','1A','1A','1A'],
'Marker': ['M1','M2','M3','M4','M5'],
'Position': [0,1.2,3.5,6,7.3]})
df2 = pd.DataFrame({'Chromosome': ['1A','1A','1A','1A','1A','1B','1B','1B'],
'Marker': ['M1','M2','M3','M4','M5','mk1','mk2','mk3'],
'Position': [0,1.2,3.5,6,7.3,0,2.3,3.2]})
#Expected result for df1
#'1A 5 M1 1.2 M2 2.3 M3 2.5 M4 1.3 M5'
#Expected result for df2
#'1A 5 M1 1.2 M2 2.3 M3 2.5 M4 1.3 M5'
#'1B 3 mk1 2.3 mk2 0.9 mk3'
#My function for computing intermarker distance
def position_interval(df):
df.loc[:,'diffPos'] = round(df['Position'].diff(),1).shift(-1)
a = []
i = 0
while i < df.shape[0]:#omit the last index
info = df['Marker'][i]+' '+str(round(df['diffPos'][i],1))
#print(info)
a.append(info)
i +=1
#print(a)
a.insert(0,str(len(df['Marker'])))
a.insert(0,df['Chromosome'][0])
new_info = ' '.join(a).replace(' nan','')#removing the last ' nan'
#print(new_info)
return new_info
将该函数应用于 df1 效果很好:
position_interval(df1)
但我不确定如何应用于每个 grouby 对象:
position_interval(df2)
解决方案
由于该函数需要“染色体”键,因此您必须将as_index=False
参数放在 groupby 中:
df2.groupby('Chromosome', as_index=False).apply(position_interval)
这将引发异常,因为找不到“1B”组的索引 0。
替换iloc
函数中的系列切片将解决此问题:
def position_interval(df):
df.loc[:,'diffPos'] = round(df['Position'].diff(),1).shift(-1)
a = []
i = 0
while i < df.shape[0]:#omit the last index
info = df['Marker'].iloc[0]+' '+str(round(df['diffPos'].iloc[i],1))
#print(info)
a.append(info)
i +=1
#print(a)
a.insert(0,str(len(df['Marker'])))
a.insert(0,df['Chromosome'].iloc[0])
new_info = ' '.join(a).replace(' nan','')#removing the last ' nan'
#print(new_info)
return new_info
输出 :
1A 5 M1 1.2 M1 2.3 M1 2.5 M1 1.3 M1
1B 3 mk1 2.3 mk1 0.9 mk1
选择 :
可以迭代 groupby 对象:
for i, sub_df in f2.groupby('Chromosome',as_index=False):
print(position_interval(sub_df))
推荐阅读
- android - 将帖子发送到服务器并通过 android 获取结果
- android - 为什么 ADB Over WIFI 无法在 Android 10 上运行
- jquery - 如何按类别分隔行中的特定项目,如果有一个项目具有不同的类别,则追加到新行中
- javascript - 角度路由,包括身份验证保护和重定向
- javascript - 防止重新渲染数组映射组件
- typescript - 如何将声明的条件推断类型与另一个类似的条件推断类型匹配
- c# - 检查两个具有半径的地理位置是否在彼此的半径内
- python - 如何在 unittest 测试期间添加计数器?
- python - 第三方包的 mock.patch() 的 Pytest 路径
- django - Django - 将二进制流转换为图像