Python,Pandas使用重复行计算平均值

时间:2018-09-25 08:39:09

标签: python pandas numpy dataframe

要根据“ n”列中的值复制行,并用平均值(v除以n)重新分配“ v”列中的值,如下所示:

enter image description here

我正在跟踪Replicating rows in a pandas data frame by a column value上的示例。

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'

这里出了什么问题,我该如何解决?谢谢。 (其他一些熊猫和numpy脚本在计算机上都可以正常工作。)

1 个答案:

答案 0 :(得分:1)

我们通常每个线程仅回答一个问题,但您可能不知道。 对于第一个问题,已在评论中得到回答。强制转换为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行,这是在熊猫中定位数据时的最佳实践。

如评论中所述,它将引发警告。您可以看到reading this link,该警告确实具有误报。只要您知道自己在做什么,就应该没事。这里的警告是要告诉您方法df.loc[]返回了DataFrame的副本,并且您没有使用它……因此您可能做错了事实。

tl; dr,您可以通过以下方式禁用警告:

pd.options.mode.chained_assignment = None # default='warn'