熊猫,Apply函数返回错误结果

时间:2020-03-25 22:17:50

标签: python pandas

此功能存在这个问题,该功能必须在一列中返回每个功能的比例。

以下一些数据很容易构成一个想法:

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

谢谢您的帮助。

2 个答案:

答案 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索引相匹配的位置分配索引,而无论顺序如何,以及是否存在重复的索引。

作为替代方案,您可以mergeX进行简单的连接。

答案 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))列中元素相对出现的序列。