我想使用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], '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: cannot reindex from a duplicate axis
为了澄清这一点:前4行为df.a/df.a[0]
,后4为df.a/df.a[4]
,df.a/df.a[8]
为最后2行为df["d"]= [0,0,0,0,4,4,4,4,8,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]
答案 0 :(得分:2)
我就是这样做的。坦率地说,我怀疑是否需要列#d; 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)