熊猫,应用函数返回错误的结果

我有这个函数的问题,它必须返回一列中每个特征的比例。


以下是一些很容易编造的数据:


df2 = pd.DataFrame({'X': ['A', 'A', 'B' , 'C'], 'Y': [1, 0, 0 , 1], 'Z': [1, 0, 1 , 1]})


df2['X'].value_counts() 

当我计算我得到的值时


A    2

B    1

C    1

现在,我需要获取“X”每个值的比例


for freq in df2['X'].value_counts():

    #print(freq)

    print(freq/df2['X'].value_counts().sum())

结果如下:


0.5

0.25

0.25

完善


现在我必须应用于我的数据帧并获取新列。功能下方:


def get_proportion(df):

    for freq in df2['X'].value_counts():

        return (freq/df2['X'].value_counts().sum())


df2["A"]=df2.apply(get_proportion, axis=1)

结果:


    X   Y   Z   A

0   A   1   1   0.5

1   A   0   0   0.5

2   B   0   1   0.5

3   C   1   1   0.5

我应该得到


    X   Y   Z   A

0   A   1   1   0.5

1   A   0   0   0.5

2   B   0   1   0.25

3   C   1   1   0.25

怎么了?


如果设置返回循环下,我得到缩进错误


def get_proportion(df):

    for freq in df['X'].value_counts():

    return freq/df['X'].value_counts().sum()

缩进错误:预期缩进块


如果我设置了一个参数


df2["A"]=df2.apply(get_proportion(df2), axis=1)

我收到错误


TypeError: 'numpy.float64' object is not callable

如果你能帮忙,谢谢你。


慕运维8079593
浏览 76回答 2
2回答

catspeake

您可以执行(修复第一次尝试):dftemp=df2['X'].value_counts(normalize=True)df2=df2.set_index("X")df2["A"]=dftempdf2=df2.reset_index()您的尝试不起作用的原因是,在分配期间基于索引的自动拟合(即pandasdf1['x']=df2['y']不会按顺序赋值,但仅在索引与索引匹配的位置分配值,而不管顺序如何,也无论是否存在重复的索引。df2df1df2作为替代方案,您可以使用它们并通过 进行简单的连接。mergeX

手掌心

df2["A"] = df2.X.apply(lambda x: (df2["X"].value_counts() / len(df2))[x])len(df2)是数据帧的行数,df2(df2["X"].value_counts() / len(df2))是列 中元素的相对出现的序列。"X"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python