Преобразование столбцов объектов, кроме одного, в целое число (pd.to_numeric не работает; данные перечислены как объект и с ошибкой указаны как плавающие)

#python #pandas #matplotlib

Вопрос:

Я столкнулся с проблемой, когда мои данные в какой-то момент были перечислены как объект, а затем была выдана ошибка из-за того, что они были «плавающими»

У меня есть столбцы, которые прямо сейчас набраны как объекты здесь:

 Household    Energy   Water   Food
Brunt         23%      34%    43%
Liv           17%      29%    54%
Rowan         37%      22%    41%
Lisz          32%      32%    36%
 

Я пытаюсь удалить»%», перевести их в десятичную форму и превратить их в int следующий метод:

 df.update(df.apply(lambda x : pd.to_numeric(x.str.rstrip('%'),downcast='integer',errors='coerce'))/100)
 

Но , как я проверяю df.info() , в нем объекты указываются как неподвижные объекты.

Я пытаюсь изобразить это в виде горизонтальной гистограммы, на которой значение % указано на соответствующих столбцах us matplotlib. Но когда я пытаюсь применить следующее:

 df.plot( 
    x = 'Household', 
    kind = 'barh', 
    stacked = True, 
    title = 'Cluster 1021 HH Consumption', 
    mark_right = True) 

df_total = df.iloc[:,-17:-1].sum(axis=0)
df_rel = df[df.columns[1:]].div(df_total, 0)*100
  
for n in df_rel:
    for i, (cs, ab, pc, tot) in enumerate(zip(df.iloc[:, 1:].cumsum(1)[n], df_rel[n], df_total[n])): 
        plt.text(tot, i, str(tot), va='center')
        plt.text(cs - ab/2, i, str(np.round(pc, 1))   '%', va='center', ha='center')
 

Это дает мне TypeError: 'float' object is not iterable во втором for . Как такое может быть? Как я могу это исправить?

Ответ №1:

Сначала создается список столбцов, содержащих '%' символ и в которые вы хотите преобразовать int :-

 col=df.columns[1:]
 

Вывод приведенного выше кода является Index(['Energy', 'Water', 'Food'], dtype='object')

Вы можете использовать for loop , replace() метод и astype() метод:-

 for x in col:
    df[x]=df[x].str.replace('%','').astype(int)
 

Теперь, если вы наберете df.info() , это покажет int

Комментарии:

1. По какой-то причине это выглядит как ключевая ошибка: «Энергия» с моей стороны

2. Большое вам спасибо! Он действительно преобразовался в int! Но теперь это дает мне ошибку типа: объект ‘numpy.int64’ не повторяется там, где была предыдущая ошибка типа. Извините, я не знаю, почему это всегда не повторяемая ошибка

3. что вы пытаетесь здесь сделать :- for n in df_rel: bcz ваша df.plot() работа в порядке

4. Да, df.plot() все работает нормально. for n in df_rel: Именно здесь я пытаюсь поместить значения % на горизонтальную диаграмму из df.plot()

5. ооо..Я не знаю об этом, но вы можете подождать, пока кто-нибудь другой ответит на этот вопрос, или вы можете изменить/обновить свой текущий вопрос, упомянув о своей текущей проблеме….или задать другой вопрос об этом, поскольку вы решили часть преобразования dtype