我有这个函数的问题,它必须返回一列中每个特征的比例。以下是一些很容易编造的数据: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

手掌心
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"
添加回答
举报
0/150
提交
取消