我在使用此功能时遇到此问题,该功能必须在一列中返回每个功能的比例。
这里有些数据很容易构成一个想法: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()
IndentationError:期望缩进的块
如果我设置参数df2["A"]=df2.apply(get_proportion(df2), axis=1)
我收到错误TypeError: 'numpy.float64' object is not callable
我尝试另一种方法,def get_proportion(df):
val=[]
for freq in df.value_counts():
xv=freq/df.value_counts().sum()
print(xv)
val.append(xv)
#df2["A"] = df2[xv]
#return freq/df.value_counts().sum()
return val
val=get_proportion(df2['X'])
我得到了很好的结果0.5
0.25
0.25
当我加入数据框时df2["A"]=df2.join(pd.DataFrame(val))
我得到:X Y Z A
0 A 1 1 A
1 A 0 0 A
2 B 0 1 B
3 C 1 1 C
我不明白。我跳过一些东西谢谢您的帮助。