Карлос Карвальо:
Я этот вопрос с помощью этой функции, которая должна вернуть долю каждого элемента в одном столбце.
Вот некоторые данные очень легко составить представление:
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)
это количество строк dataframedf2
,(df2["X"].value_counts() / len(df2))
представляет собой ряд с относительными вхождений элементов в столбце"X"
.