为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕运维8079593 2022-09-13 10:05:49
我有这个函数的问题,它必须返回一列中每个特征的比例。以下是一些很容易编造的数据:df2 = pd.DataFrame({'X': ['A', 'A', 'B' , 'C'], 'Y': [1, 0, 0 , 1], 'Z': [1, 0, 1 , 1]})df2['X'].value_counts() 当我计算我得到的值时A    2B    1C    1现在,我需要获取“X”每个值的比例for freq in df2['X'].value_counts():    #print(freq)    print(freq/df2['X'].value_counts().sum())结果如下:0.50.250.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   A0   A   1   1   0.51   A   0   0   0.52   B   0   1   0.53   C   1   1   0.5我应该得到    X   Y   Z   A0   A   1   1   0.51   A   0   0   0.52   B   0   1   0.253   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如果你能帮忙,谢谢你。
查看完整描述

2 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

您可以执行(修复第一次尝试):


dftemp=df2['X'].value_counts(normalize=True)

df2=df2.set_index("X")

df2["A"]=dftemp

df2=df2.reset_index()

您的尝试不起作用的原因是,在分配期间基于索引的自动拟合(即pandas


df1['x']=df2['y']


不会按顺序赋值,但仅在索引与索引匹配的位置分配值,而不管顺序如何,也无论是否存在重复的索引。df2df1df2


作为替代方案,您可以使用它们并通过 进行简单的连接。mergeX


查看完整回答
反对 回复 2022-09-13
?
手掌心

TA贡献1942条经验 获得超3个赞

df2["A"] = df2.X.apply(lambda x: (df2["X"].value_counts() / len(df2))[x])

  • len(df2)是数据帧的行数,df2

  • (df2["X"].value_counts() / len(df2))是列 中元素的相对出现的序列。"X"


查看完整回答
反对 回复 2022-09-13
  • 2 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号