Python 如何按熊猫分组。数据帧';基于另一个pandas.Series的索引和值的s列?

Python 如何按熊猫分组。数据帧';基于另一个pandas.Series的索引和值的s列?,python,pandas,numpy,dataframe,series,Python,Pandas,Numpy,Dataframe,Series,我试图根据另一个pandas.Series的值和索引,将数据帧的列分组在一起。该系列的索引引用数据帧的列,但可能有更多的元素。做这件事最好的方法是什么 为了进一步说明,下面是我试图解决的单元测试(使用pytest): 非常感谢 经过进一步研究,我找到了一个解决方案。下面是我在数据框的列上使用pandas.Series.map得到的结果: def sum_weights_by_classification_labels(security_weights, security_classificati

我试图根据另一个pandas.Series的值和索引,将数据帧的列分组在一起。该系列的索引引用数据帧的列,但可能有更多的元素。做这件事最好的方法是什么

为了进一步说明,下面是我试图解决的单元测试(使用pytest):


非常感谢

经过进一步研究,我找到了一个解决方案。下面是我在数据框的列上使用
pandas.Series.map
得到的结果:

def sum_weights_by_classification_labels(security_weights, security_classification):

    classification_weights = security_weights.copy()
    classification_weights.columns = classification_weights.columns.map(security_classification)
    classification_weights = classification_weights.groupby(classification_weights.columns, axis=1).sum()

    return classification_weights
或者使用
pandas.DataFrame.merge

def sum_weights_by_classification_labels(security_weights, security_classification):

    security_weights_transposed = security_weights.transpose()
    merged_data = security_weights_transposed.merge(security_classification, how='left', left_index=True, 
                                                    right_index=True)
    classification_weights = merged_data.groupby(security_classification.name).sum().transpose()

    return classification_weights
对于第二个解决方案,需要将此行添加到单元测试中,因为无法合并没有名称的系列(添加的列需要有一个):

result\u sector\u weights.columns.name=security\u classification.name

我一直在写这篇文章,希望将来能对别人有所帮助


这就是

我希望我尊重SO的指导方针。我知道有不止一个问题,但实际上是关于让我的代码成为pythonic的,因为我要做很多类似的函数,只想得到最佳实践。感谢最佳实践是一个意见问题。所以不是一个代码审查网站。有一个姐妹网站。这样做是为了解决编程问题,而您似乎没有。因此,我投票决定结束。是的,这就是我所担心的,对不起那个“疯狂的物理学家”。我将回顾这个问题或删除它,我认为对于那些试图根据另一个df或系列进行分组的人来说仍然有价值。谢谢你的评论,希望现在好多了。保留这篇文章是因为在搜索之后,其他地方似乎没有类似的东西,希望它能在将来帮助别人。干杯,如果您使用的是
left\u index=True
right\u index=True
,那么您最好使用。
def sum_weights_by_classification_labels(security_weights, security_classification):

    security_weights_transposed = security_weights.transpose()
    merged_data = security_weights_transposed.merge(security_classification, how='left', left_index=True, 
                                                    right_index=True)
    classification_weights = merged_data.groupby(security_classification.name).sum().transpose()

    return classification_weights