Оба примера кода, предоставленные в вашем вопросе. Однако они не являются идиоматическим способом достижения того, что вы хотите сделать, особенно первого.
Я думаю, что это правильный способ получить ожидаемое поведение.
# Test data
df = DataFrame({'Dependents': ['0', '1', '0', '0', '0'],
'Married': ['No', 'Yes', 'Yes', 'Yes', 'No']})
# Converting object to int
df['Dependents'] = df['Dependents'].astype(int)
# Computing the mean by group
df.groupby('Married').mean()
Dependents
Married
No 0.00
Yes 0.33
Однако, следующий код работает.
df.pivot_table(values = 'Dependents', index = 'Married',
aggfunc = lambda x: x.map(int).mean())
Это эквивалентно (и более удобным для чтения) преобразования в int
с map
, прежде чем данные поворота.
df['Dependents'] = df['Dependents'].map(int)
df.pivot_table(values = 'Dependents', index = 'Married')
Редактировать
Я у вас есть грязный DataFrame
, вы можете использовать to_numeric
с параметром error
, установленным в coerce
.
Если coerce
, то недействителен разбор будет установлен в качестве NaN
# Test data
df = DataFrame({'Dependents': ['0', '1', '2', '3+', 'NaN'],
'Married': ['No', 'Yes', 'Yes', 'Yes', 'No']})
df['Dependents'] = pd.to_numeric(df['Dependents'], errors='coerce')
print(df)
Dependents Married
0 0.0 No
1 1.0 Yes
2 2.0 Yes
3 NaN Yes
4 NaN No
print(df.groupby('Married').mean())
Dependents
Married
No 0.0
Yes 1.5
Смотрит вы пропустили набор скобок вокруг лямбды во втором сете. Кроме того, почему бы просто не использовать aggfunc = int? –
Есть ли причина, по которой вы не конвертируете все это в целые числа при импорте или предварительной обработке? 'df = pd.read_csv ('bleh.csv'). assign (Dependents = lambda d: d.Dependents.astype (" int "))' или аналогичный метод? –
@Sohier Dane. Я не верю, что() пропущено вокруг лямбда-функции. Я пытался сопоставить pd-серию, если str для int затем получает среднее значение. Мне нужно знать, что средние иждивенцы, у которых есть женатые, имеют сингл. – FrankZhu