[英]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.