Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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 基于行操作添加新列_Python_Pandas_Gini - Fatal编程技术网

Python 基于行操作添加新列

Python 基于行操作添加新列,python,pandas,gini,Python,Pandas,Gini,我有这样一个数据帧: Interesting genre_1 probabilities 1 no Empty 0.251306 2 yes Empty 0.042043 3 no Alternative 5.871099 4 yes Alternative 5.723896 5

我有这样一个数据帧:

Interesting           genre_1        probabilities
    1    no            Empty        0.251306
    2    yes           Empty        0.042043
    3     no          Alternative    5.871099
    4    yes         Alternative    5.723896
    5    no           Blues         0.027028
    6    yes          Blues         0.120248
    7    no          Children's     0.207213
    8    yes         Children's     0.426679
    9    no          Classical      0.306316
    10    yes         Classical      1.044135
我想根据有趣的专栏对同一类别执行基尼指数。在那之后,我想在一个新的熊猫栏中添加这样一个值

这是获取基尼指数的函数:

#Gini Function
#a and b are the quantities of each class
def gini(a,b):
    a1 = (a/(a+b))**2
    b1 = (b/(a+b))**2
    return 1 - (a1 + b1) 
编辑*很抱歉,我的最终所需数据帧出现错误。在选择prob(A)和prob(B)时,有趣与否很重要,但基尼分数将是相同的,因为它将衡量一首歌有趣与否的程度。因此,如果概率在50/50%左右,则意味着基尼得分将达到最大值(0.5),这是因为同样可能会错误地选择有趣与否

因此,对于前两行,基尼指数将为:

a=no; b=Empty -> gini(0.251306, 0.042043)= 0.245559831601612
a=yes; b=Empty -> gini(0.042043, 0.251306)= 0.245559831601612
然后我想得到如下结果:

 Interesting           genre_1        percentages.  GINI INDEX
        1    no            Empty        0.251306         0.245559831601612
        2    yes           Empty        0.042043         0.245559831601612
        3     no          Alternative    5.871099         0.4999194135183881
        4    yes         Alternative    5.723896.     0.4999194135183881
        5    no           Blues         0.027028          ..
        6    yes          Blues         0.120248
        7    no          Children's     0.207213
        8    yes         Children's     0.426679
        9    no          Classical      0.306316          ..
        10    yes         Classical      1.044135         ..

我不确定
有趣的
列如何在所有这些方面发挥作用,但我强烈建议您使用
numpy.where()
创建新的列。语法类似于:

import numpy as np
df['GINI INDEX'] = np.where(__condition__,__what to do if true__,__what to do if false__)

我不确定
有趣的
列如何在所有这些方面发挥作用,但我强烈建议您使用
numpy.where()
创建新的列。语法类似于:

import numpy as np
df['GINI INDEX'] = np.where(__condition__,__what to do if true__,__what to do if false__)

好的,我想我知道你的意思。如果感兴趣的值是“是”或“否”,下面的代码并不重要。但是你想要的是,根据每一行的有趣值,用两种不同的方法计算每一行的基尼系数。如果interest==no,那么结果是0.5,因为a==b。但是如果有趣的是“是”,那么你需要使用a=概率[i]和b=概率[i+1]。因此,请跳过本节,了解下面更新的代码

将熊猫作为pd导入
df=pd.read\u csv('df.txt',delim\u whitespace=True)
probs=df[“概率”]
def ROLLING_GINI(概率):
a1=(概率[0]/(概率[0]+概率[0])**2
b1=(概率[0]/(概率[0]+概率[0])**2
res=1-(a1+b1)
收益率
对于范围内的i(len(概率)-1):
a1=(概率[i]/(概率[i]+概率[i+1])**2
b1=(概率[i+1]/(概率[i]+概率[i+1])**2
res=1-(a1+b1)
收益率
df['GINI']=[val代表滚动中的val(概率)]
打印(df)
这就是真正的麻烦开始的地方,因为如果我正确理解你的想法,那么你就无法计算最后的基尼值,因为你的数据帧不允许。这里重要的一点是,数据帧中最后一个有趣的值是“yes”。这意味着我必须使用a=概率[I]和b=概率[I+1]。但是您的数据帧没有第11行。有10行,第i行=10,第11行需要一个概率来计算基尼系数。因此,为了让您的想法发挥作用,最后一个有趣的值必须是“否”,否则您将始终得到一个索引错误

下面是代码:

将熊猫作为pd导入
df=pd.read\u csv('df.txt',delim\u whitespace=True)
def ROLLING_GINI(数据帧):
概率=数据帧[“概率”]
如何计算=数据帧[“有趣”]
对于范围内的i(len(数据帧)-1):
如果如何计算[i]=“是”:
a1=(概率[i]/(概率[i]+概率[i+1])**2
b1=(概率[i+1]/(概率[i]+概率[i+1])**2
res=1-(a1+b1)
收益率
elif如何计算[i]=“否”:
a1=(概率[i]/(概率[i]+概率[i])**2
b1=(概率[i]/(概率[i]+概率[i])**2
res=1-(a1+b1)
收益率
基尼=[滚动基尼(df)中的val对应val]
打印('所有基尼系数:%s'%基尼〕
打印('所有可计算基尼系数的长度:%s'%len(基尼))
打印('数据帧中的行数:%s'%len(df))
print('最后一个有趣的值是:%s'%df.iloc[-1,0])
编辑第三条(很抱歉延迟实现):

因此,如果我正确地应用索引,它确实有效。问题是我想用下一个概率,而不是上一个。所以它是a=概率[i-1]和b=概率[i]

将熊猫作为pd导入
df=pd.read\u csv('df.txt',delim\u whitespace=True)
def ROLLING_GINI(数据帧):
概率=数据帧[“概率”]
如何计算=数据帧[“有趣”]
对于范围内的i(len(数据帧)):
如果如何计算[i]=“是”:
a1=(概率[i-1]/(概率[i-1]+概率[i])**2
b1=(概率[i]/(概率[i-1]+概率[i])**2
res=1-(a1+b1)
收益率
elif如何计算[i]=“否”:
a1=(概率[i]/(概率[i]+概率[i])**2
b1=(概率[i]/(概率[i]+概率[i])**2
res=1-(a1+b1)
收益率
基尼=[滚动基尼(df)中的val对应val]
打印('所有基尼系数:%s'%基尼〕
打印('所有可计算基尼系数的长度:%s'%len(基尼))
打印('数据帧中的行数:%s'%len(df))
print('最后一个有趣的值是:%s'%df.iloc[-1,0])

好的,我想我知道你的意思。如果感兴趣的值是“是”或“否”,下面的代码并不重要。但是你想要的是,根据每一行的有趣值,用两种不同的方法计算每一行的基尼系数。如果interest==no,那么结果是0.5,因为a==b。但是如果有趣的是“是”,那么你需要使用a=概率[i]和b=概率[i+1]。因此,请跳过本节,了解下面更新的代码

将熊猫作为pd导入
df=pd.read\u csv('df.txt',delim\u whitespace=True)
probs=df[“概率”]
def ROLLING_GINI(概率):
a1=(概率[0]/(概率[0]+概率[0])**2
b1=(概率[0]/(概率