Python,用于计算复制行的平均值
要根据列“n”中的值复制行,并使用平均值(v除以n)重新分配列“v”中的值,如下所示: 我在跟踪样品 但它会返回一条错误消息:Python,用于计算复制行的平均值,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,要根据列“n”中的值复制行,并使用平均值(v除以n)重新分配列“v”中的值,如下所示: 我在跟踪样品 但它会返回一条错误消息: 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-packa
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'
回溯(最近一次呼叫最后一次):
文件“C:\Python27\Working Scripts\pv.py”,第14行,在
df2=df.loc[np.repeat(df.index.values,df.n)]
文件“C:\Python27\lib\site packages\numpy\core\fromneric.py”,第445行,重复
返回_wrapfunc(a,‘重复’,重复,轴=轴)
文件“C:\Python27\lib\site packages\numpy\core\fromneric.py”,第61行,在\u wrapfunc中
返回_wrapit(对象,方法,*args,**kwds)
文件“C:\Python27\lib\site packages\numpy\core\fromneric.py”,第41行,在\u wrapit中
结果=getattr(asarray(obj),方法)(*args,**kwds)
TypeError:无法根据“安全”规则将数组数据从dtype('int64')强制转换为dtype('int32')
这里出了什么问题,我如何纠正?非常感谢。(其他一些panda和numpy脚本在计算机中运行良好。)我们通常每个线程只回答一个问题,但您可能不知道。 第一个问题已在评论中得到答复。强制转换到
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']
,这是在pandas中定位数据时的最佳实践
如评论中所述,它发出了警告。您可以看到此警告不会出现误报。只要你知道你在做什么,你就应该没事。此警告旨在告诉您,方法df.loc[]
返回数据帧的副本,而您没有使用它。。。因此,你可能做错了事情
tl;从链接中,您可以通过以下操作禁用警告:
pd.options.mode.chained\u assignment=None#default='warn'
我无法复制,它在我的机器上工作。我有熊猫0.23.4,试试升级吧?它对我也有用。试试df.reindex(df.index.repeat(df.n))?@IMCoins,谢谢。我将pandas升级到0.23.4,numpy升级到1.15.2,但仍然是一样的。@Abhi,升级pandas和numpy后,仍然是一样的……这些都是我在黑暗中拍摄的照片,因为我无法复制。尝试执行df.index.values.astype('int32')
?再次感谢。伟大的发现与问题的完美解决方案!它对df2['v']=df2['v']/df2['n']也没有什么警告。“试图在数据帧切片的副本上设置值。请尝试改用.loc[row\u indexer,col\u indexer]=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)]
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