Python 如何使用数据帧行的值定义数据帧中的位置?
我想使用df.d的值来定义df.a在应用计算时引用的位置。但这显然不起作用Python 如何使用数据帧行的值定义数据帧中的位置?,python,pandas,Python,Pandas,我想使用df.d的值来定义df.a在应用计算时引用的位置。但这显然不起作用 import pandas as pd import numpy as np import datetime randn = np.random.randn rng = pd.date_range('1/1/2011', periods=10, freq='D') df = pd.DataFrame({'a': [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0], '
import pandas as pd
import numpy as np
import datetime
randn = np.random.randn
rng = pd.date_range('1/1/2011', periods=10, freq='D')
df = pd.DataFrame({'a': [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0], 'b': [1.1, 1.7, 1.3, 1.6, 1.5, 1.1, 1.5, 1.7, 2.1, 1.9],'c':[None] * 10},index=rng)
df["d"]= [0,0,0,0,4,4,4,4,8,8]
df["c"] =df.a/df.a[df.d]
但是我只得到了一个错误ValueError:cannotreindexfromDuplicateAxis
为了澄清这一点:df.a/df.a[0]
对于前4行,df.a/df.a[4]
对于下4行,df.a/df.a[8]
对于最后2行,根据df[“d”]=[0,0,0,4,4,4,4,8]
那么,我如何才能正确引用数据帧中的值,而不出现此错误呢
所需的输出如下所示:
a b c d
2011-01-01 1.1 1.1 1 0 # df.a/df.a[0]
2011-01-02 1.2 1.7 1.090909090909091 0 # df.a/df.a[0]
2011-01-03 1.3 1.3 1.181818181818182 0 # df.a/df.a[0]
2011-01-04 1.4 1.6 1.272727272727273 0 # df.a/df.a[0]
2011-01-05 1.5 1.5 1 4 # df.a/df.a[4]
2011-01-06 1.6 1.1 1.066666666666667 4 # df.a/df.a[4]
2011-01-07 1.7 1.5 1.133333333333333 4 # df.a/df.a[4]
2011-01-08 1.8 1.7 1.2 4 # df.a/df.a[4]
2011-01-09 1.9 2.1 1 8 # df.a/df.a[8]
2011-01-10 2.0 1.9 1.052631578947368 8 # df.a/df.a[8]
因此,对于x=df.d,它总是
df.a/df.a[x]
,我就是这样做的。坦率地说,我会怀疑在数据框中是否需要“d”列。我会把它分开。但是,如果您真的想这样做,那么使用您的设置,您可以简单地编写:
df['c'] = pd.Series([df.ix[x, 'a']/df.ix[int(df.ix[x, 'd']), 'a']
for x in xrange(len(df))],
index = df.index)
In [107]: df
Out[107]:
a b d c
2011-01-01 1.1 1.1 0 1.000000
2011-01-02 1.2 1.7 0 1.090909
2011-01-03 1.3 1.3 0 1.181818
2011-01-04 1.4 1.6 0 1.272727
2011-01-05 1.5 1.5 4 1.000000
2011-01-06 1.6 1.1 4 1.066667
2011-01-07 1.7 1.5 4 1.133333
2011-01-08 1.8 1.7 4 1.200000
2011-01-09 1.9 2.1 8 1.000000
2011-01-10 2.0 1.9 8 1.052632
我认为以下是一种更合理的设置:
df = pd.DataFrame({ 'a': [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0],
'b': [1.1, 1.7, 1.3, 1.6, 1.5, 1.1, 1.5, 1.7, 2.1, 1.9]},
index=rng)
indexer = [0, 0, 0, 0, 4, 4, 4, 4, 8, 8]
df['c'] = pd.Series([df.ix[x, 'a']/df.ix[indexer[x], 'a'] for x in xrange(len(df))],
index = df.index)
df.a[df.d]
是否返回任何内容?您可能需要尝试df.a.loc[df.d,:]
来代替。a[df.d]会出现所描述的错误,df.a.loc[df.d,:]会出现:keyrerror:“[2011-01-01 0\n..\n2011-01-10 8\nFreq:d,Name:d,dtype:int64]都不在[index]中,您能手动生成一些所需的输出吗?”太好了,非常感谢!那很好用!我想我们肯定需要d列,因为我们需要这一部分来解决一个更复杂的问题:这实际上是另一个问题的第二阶段,第一阶段是如何计算“d”。是这样吗?如果是这样的话,我相信我能帮上忙,但我一辈子都不明白如何从你的另一个问题计算d列。如果你能说清楚,我相信我能很容易地解决,