如何使用数据帧行的值定义数据框中的位置?

时间:2015-06-06 02:59:43

标签: 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], '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]

1 个答案:

答案 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)