Панды, Применить функцию результаты возврата неправильно

Карлос Карвальо:

Я этот вопрос с помощью этой функции, которая должна вернуть долю каждого элемента в одном столбце.

Вот некоторые данные очень легко составить представление:

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

Отлично,

Теперь я должен обратиться к моему Dataframe и получить новую колонку. Ниже функции:

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

Спасибо если вы можете помочь.

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

  • len(df2)это количество строк dataframe df2,
  • (df2["X"].value_counts() / len(df2))представляет собой ряд с относительными вхождений элементов в столбце "X".

рекомендация

отhttp://43.154.161.224:23101/article/api/json?id=373236&siteId=1
рекомендация