Обычно мы отвечаем только на один вопрос в теме, но вы, вероятно, не знали.На первый вопрос ответили в комментариях.Приведение к int32
явно решило вашу проблему.
Что касается среднего вопроса, вы всегда можете переназначить значения, выполнив ...
import pandas as pd
import numpy as np
df = pd.DataFrame(data={
'id': ['A', 'B', 'C'],
'n' : [1, 2, 3],
'v' : [ 10, 13, 8]
})
df2 = df.loc[np.repeat(df.index.values,df.n)]
df2.loc[:, 'v'] = df2['v'] / df2['n']
print df2
# id n v
# 0 A 1 10.000000
# 1 B 2 6.500000
# 1 B 2 6.500000
# 2 C 3 2.666667
# 2 C 3 2.666667
# 2 C 3 2.666667
Я исправил строку df2['v'] = df2['v'] / df2['n']
, с.loc
метод, который является наилучшей практикой при нацеливании данных в пандах.
Как указано в комментариях, он выдает предупреждение.Вы можете видеть читая эту ссылку , что это предупреждение ложных срабатываний .Пока вы знаете, что делаете, у вас все будет хорошо.Это предупреждение здесь для того, чтобы сообщить вам, что метод df.loc[]
возвращает копию DataFrame, а вы ее не используете ... отсюда тот факт, что вы можете делать что-то не так.
tl; dr fromПо ссылке можно отключить предупреждение, выполнив:
pd.options.mode.chained_assignment = None # default='warn'