此功能存在这个问题,该功能必须在一列中返回每个功能的比例。
以下一些数据很容易构成一个想法:
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
怎么了?
如果在循环下设置return,则会出现缩进错误
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
谢谢您的帮助。
答案 0 :(得分:1)
您可以(解决第一次尝试):
dftemp=df2['X'].value_counts(normalize=True)
df2=df2.set_index("X")
df2["A"]=dftemp
df2=df2.reset_index()
您的尝试失败的原因是因为pandas
在分配过程中即进行了基于索引的自动拟合,即
df1['x']=df2['y']
不会按顺序分配df2
值,而只会在df1
索引与df2
索引相匹配的位置分配索引,而无论顺序如何,以及是否存在重复的索引。
作为替代方案,您可以merge
和X
进行简单的连接。
答案 1 :(得分:0)
implicit def numericFrom[T](s: T)(implicit evidence: QueryValue[T]): NumericCol[T] = new NumericCol[T] {}
df2["A"] = df2.X.apply(lambda x: (df2["X"].value_counts() / len(df2))[x])
是数据框len(df2)
的行数,df2
是在(df2["X"].value_counts() / len(df2))
列中元素相对出现的序列。