Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何结合子组中的条件语句在groupby中分配权重_Python_Pandas_Dataframe_Pandas Groupby_Data Manipulation - Fatal编程技术网

Python 如何结合子组中的条件语句在groupby中分配权重

Python 如何结合子组中的条件语句在groupby中分配权重,python,pandas,dataframe,pandas-groupby,data-manipulation,Python,Pandas,Dataframe,Pandas Groupby,Data Manipulation,嗨 我的数据集有7列(见图)。首先,我想按名称列分组,然后我想按如下方式分配权重: 计算名称中所有n个ID的1/n的10%(如果名称的提供程序大于1)。n=一个名称的唯一ID计数。以萨米为例,n=2 如果列Accel_5为1,则添加5%的1/n;如果Accel_10为1,则添加额外的10%的1/n;如果Accel_15为1,则添加额外的15%的1/n 每增加一项技术,增加10% 总之,按姓名分组(Sammy、Josh、Sarah),然后计算;1/n的10%(如果提供商大于1)+1/n的5%(如果

我的数据集有7列(见图)。首先,我想按名称列分组,然后我想按如下方式分配权重:

  • 计算名称中所有n个ID的1/n的10%(如果名称的提供程序大于1)。n=一个名称的唯一ID计数。以萨米为例,n=2
  • 如果列Accel_5为1,则添加5%的1/n;如果Accel_10为1,则添加额外的10%的1/n;如果Accel_15为1,则添加额外的15%的1/n
  • 每增加一项技术,增加10%
  • 总之,按姓名分组(Sammy、Josh、Sarah),然后计算;1/n的10%(如果提供商大于1)+1/n的5%(如果Accel_5等于1)+1/n的10%(如果Accel_10等于1)+1/n的15%(如果Accel_15等于1)+1/n的10%(对于每个附加技术)

    我只能按姓名分组,而且我已经按姓名获得了唯一的ID号,但我被卡住了。请参见下面的示例代码:

    sample = pd.read_csv("Records.csv")
    test = sample.groupby("Name")
    test["ID"].nunique()
    
    链接到数据:

    我感谢你的帮助


    谢谢。

    您可以尝试创建自定义函数,然后使用
    .apply()
    作为:

    def assign_weights(x):
        n = len(x['ID'].unique())
        x["Weight"] = 0
    
        # 1.
        n_providers = len(x['Provider'].unique())
        if n_providers > 1:
            x["Weight"] += 0.1 * 1/n
    
        # 2. 
        if 1 in x['Accel_5']:
            x["Weight"] += 0.05 * 1/n
        if 1 in x['Accel_10']:
            x["Weight"] += 0.1 * 1/n
        if 1 in x['Accel_15']:
            x["Weight"] += 0.15 * 1/n
    
        # 3.
        n_tech = len(x['Tech'].unique())
        x["Weight"] += 0.1 * n_tech
    
        return x
    
    
    sample.groupby("Name").apply(lambda x: assign_weights(x))
    

    这将根据您提供的条件1、2和3创建一个新列
    权重
    。因为您没有以适当的方式指定输入数据(没有使用图像),所以我没有测试代码,但我相信它应该按预期工作。

    代码运行了,但没有按预期工作。每个名称的权重都是相同的。这里是该文件的链接:请澄清您当前的描述“如果
    Accel_10
    为1,则额外添加10%的1/n”,但对于Sammy,
    Accel_10
    既为0又为1。我知道这是基于名称,而不是ID,但您说Sammy“…+10%的1/2 Accel_10…”,但我的观点是Sammy有四行,其中两行的Accel_10为
    1
    ,另外两行的Accel_10为
    0
    。您希望根据Accel_10的值来调节权重,它应该是每个名称的标量值,因此我感到困惑。您的条件是Sammy的任何一行的Accel_5均
    1
    ?如果你能帮助我理解情况,我可以重写我的答案,让它按照你的意愿工作。它仍然有点不清楚。如果仅当Accel_5或Accel_10等于
    1
    时才应进行重量计算,则我们可以从以下方式开始删除所有行:
    sample=sample[(sample[“Accel_5”!=1)|(sample[“Accel_10”!=1)]
    ?然后执行计算,因为我们不应该在任何Accel_X为0时执行它?问题归结为:如果您希望每个名称都有一个标量权重,那么对于每个名称,您希望“Accel_X”有什么条件?可能是任何一行的Accel_X必须为
    1
    ,也可能是其他条件,但到目前为止,您尚未提供明确的答案。如果你提供一个明确的答案,问题是有可能解决的。