Python, Pandas для вычисления среднего с реплицированными строками - PullRequest
0 голосов
/ 25 сентября 2018

Для дублирования строк в соответствии со значением в столбце 'n' и переназначения значения в столбце 'v' со средним значением (для v, деленным на n), как показано ниже:

enter image description here

Я слежу за образцом на Репликация строк во фрейме данных pandas по значению столбца .

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)]

#pd.__version__ 0.20.3
#np.__version__ 1.15.0

Но возвращается ошибкасообщение:

Traceback (most recent call last):
  File "C:\Python27\Working Scripts\pv.py", line 14, in <module>
df2 = df.loc[np.repeat(df.index.values, df.n)]
File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 445, in repeat
return _wrapfunc(a, 'repeat', repeats, axis=axis)
File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 61, in _wrapfunc
return _wrapit(obj, method, *args, **kwds)
File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 41, in _wrapit
result = getattr(asarray(obj), method)(*args, **kwds)
TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe'

Что здесь не так и как я могу это исправить?Спасибо.(Некоторые другие панды и скрипты отлично работают на компьютере.)

1 Ответ

0 голосов
/ 25 сентября 2018

Обычно мы отвечаем только на один вопрос в теме, но вы, вероятно, не знали.На первый вопрос ответили в комментариях.Приведение к 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'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...