繁体   English   中英

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

[英]Python, Pandas to calculate average with replicated rows

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

在此处输入图片说明

我正在按照列值来复制熊猫数据框中的行中的示例。

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脚本在计算机上都可以正常工作。)

我们通常每个线程仅回答一个问题,但您可能不知道。 对于第一个问题,已在评论中得到回答。 int32转换为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

我使用.loc方法纠正了df2['v'] = df2['v'] / df2['n'] ,这是在熊猫中定位数据时的最佳实践。

如评论中所述,它会发出警告。 您可以看到阅读此链接 ,该警告会误判 只要您知道自己在做什么,就应该没事。 此警告是在这里告诉您df.loc[]方法返回了df.loc[]的副本,并且您没有使用它...因此,您可能做错了事实。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM