如果一行不存在,则在 Python 中相应地检查并赋予一个值

Posted

技术标签:

【中文标题】如果一行不存在,则在 Python 中相应地检查并赋予一个值【英文标题】:If a row does not exist check and attribute a value accordingly in Python 【发布时间】:2020-02-13 10:33:01 【问题描述】:

我有一个包含 3 列的数据框:

[输入]:

import pandas as pd
import numpy as np
df = pd.DataFrame([['Circle', 'Circle', 'Polygon', 'Polygon',"Trapezoid"], 
                   [0, 1, 0, 1,1], [28152, 9168, 24741, 11402,5000]], 
                   ['nom_1', 'target', 'id']).T 

[出]:

       nom_1 target     id
0     Circle      0  28152
1     Circle      1   9168
2    Polygon      0  24741
3    Polygon      1  11402
4  Trapezoid      1   5000

理论上,每个几何形状在目标列中的值都应该是 0 或 1。 Id 代表计数。我需要 id 列中每个几何形状的 1/(1+0) 比率。

例如,目标 1 的“Circle”id 计数为 9168,0 为 28152。我需要的计算:(9168)/(9168+28152)。我用这段代码实现了这个计算。

[输入]:

ColumnTarget = df[["id","nom_1","target"]]
ColumnGrouped = ColumnTarget.groupby(["nom_1","target"]).count()["id"].reset_index()
ColumnCalculation = ColumnGrouped.groupby("nom_1").apply(lambda row: (row[row.target ==1]["id"].iloc[0]) / (row[row.target ==0]["id"].iloc[0] + row[row.target ==1]["id"].iloc[0]))

[出]:

IndexError: single positional indexer is out-of-bounds

但是,当几何形状没有 1 或 0 目标行时,我会收到 IndexError。在这种情况下,“梯形”缺少 0 目标行。因此,如果几何形状的两个 0,1 目标都存在,我喜欢上面提到的计算。如果缺少 1 个目标,我希望结果等于 0,如果缺少 0 个目标,则结果应等于 1。例如,对于“梯形”,结果应为 1。

这是我尝试过的:

[输入]:

ColumnTarget = df[["id","nom_1","target"]]
ColumnGrouped = ColumnTarget.groupby(["nom_1","target"]).count()["id"].reset_index()
ColumnCalculation = ColumnGrouped.groupby("nom_1").apply(lambda row: 0 if row[row.target ==1].all() is False else (1 if row[row.target ==0].all() is False else ((row[row.target ==1]["id"].iloc[0]) / (row[row.target ==0]["id"].iloc[0] + row[row.target ==1]["id"].iloc[0]))))

[出]:

IndexError: single positional indexer is out-of-bounds

output_df = pd.DataFrame("nom_1":["Circle","Polygon","Trapezoid"],"result": [0.24565916398713827,0.3154691088177517,1])

【问题讨论】:

所以你只想要那个目标 == 1?你能添加一个输出DataFrame的例子吗? 当您的其余数字由于公式而在 [0,1] 之间时,您希望梯形为 5000?为什么不是 1? @DanielMesejo 我想要 1/(1+0) 的比率。添加了一个示例 output_df @ALollz 你是对的我编辑了这个问题。如果缺少目标 0 的行,则输出应为 1。 【参考方案1】:

使用transformdiv

df['id'].div(df.groupby('nom_1').id.transform('sum'), axis=0)

       nom_1 target     id     ratio
0     Circle      0  28152  0.754341
1     Circle      1   9168  0.245659
2    Polygon      0  24741  0.684531
3    Polygon      1  11402  0.315469
4  Trapezoid      1   5000         1

显然,您可以编辑此df 以仅显示带有target == 1 的行

df[df.target == 1]

       nom_1 target     id     ratio
1     Circle      1   9168  0.245659
3    Polygon      1  11402  0.315469
4  Trapezoid      1   5000         1

【讨论】:

@moli 我给了你所有的输出。然后,您可以轻松过滤最终结果以获得您的....df[df.target == 1] ...【参考方案2】:

使用index 对齐计算(我添加了一个缺少目标 == 1 的形状)。这假设您在 ['nom_id', 'target'] 上没有任何重复内容:

df = pd.DataFrame([['Circle', 'Circle', 'Polygon', 'Polygon',"Trapezoid", 'Octagon'], 
                   [0, 1, 0, 1, 1, 0], [28152, 9168, 24741, 11402,5000, 6000]], 
                   ['nom_1', 'target', 'id']).T 

df = df.set_index('nom_1')
u = df.loc[df.target.eq(1), 'id']
v = df.loc[df.target.eq(0), 'id']

                                    # - 0 When Target == 1 is missing
                                    # |
s = u.divide(u.add(v, fill_value=0)).fillna(0)
#nom_1
#Circle       0.245659
#Octagon      0.000000
#Polygon      0.315469
#Trapezoid    1.000000
#Name: id, dtype: float64

【讨论】:

以上是关于如果一行不存在,则在 Python 中相应地检查并赋予一个值的主要内容,如果未能解决你的问题,请参考以下文章

检查列是不是已存在,如果不存在,则在 sqlite 中更改表

检查返回值是不是不为空,如果是,则在一行中使用一个方法调用将其分配

如果 iPhone 应用程序中不存在,则在表中插入记录

如果文本文件不存在并显示另一个表单,则在表单加载时隐藏表单

.htaccess - 根据 URL slug 检查是不是存在多个文件并相应地重写?

如果创建文件不存在,如何创建目录?