Python 如何结合子组中的条件语句在groupby中分配权重
嗨 我的数据集有7列(见图)。首先,我想按名称列分组,然后我想按如下方式分配权重: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%(如果
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
,也可能是其他条件,但到目前为止,您尚未提供明确的答案。如果你提供一个明确的答案,问题是有可能解决的。