使用.ix

时间:2015-11-17 06:40:21

标签: python pandas

我试图在pandas数据帧中使用.ix函数划分一个单元格(后面是一系列单元格)。

下面有一个例子:

fc = pd.read_csv("H://mydata2.csv", "r", delimiter=",", index_col='Date', parse_dates=True)
aq = pd.read_csv("H://mydata.csv", "r", delimiter=",", index_col='Date', parse_dates=True)

fc.ix[fc.index.weekday == 6, 'c2':'c4'] = fc.ix[fc.index.weekday == 6, 'c2':'c4'] * .7

但是,当我尝试从一个单元格到另一个单元格进行数学运算时,它会返回NaN值

fc.ix[fc.index.astype(datetime) == datetime(2015, 12, 25), 'c2'] = fc.ix[fc.index.astype(datetime) == datetime(2015, 12, 25), 'c2'].astype(float) / aq.ix[aq.index.astype(datetime) == datetime(2014, 12, 25), 'c4'].astype(float))

问题似乎源于使用两个数据帧进行操作。当我使用这种方法对同一数据帧中的值进行数学运算时,它不会产生任何问题。

我正在使用.ix方法,因为这是我知道使用fc.index.weekday == 6等条件选择行/列的唯一方法。但是,我确信有更好的方法并且我愿意接受建议这种方法是不是正确的方法。我试图避免使用python循环方法来进行数学计算,因为它最终将在很多行上进行数学运算,并且我需要编译的pandas方法的效率。

示例数据如下。 aq数据与一年前的数据相同。

    Date      c1     c2      c3     c4
12/19/2014  5486    1265    908.6   19
12/20/2014  5513    1334    937.8   20
12/21/2014  5540    1403    967 21
12/22/2014  5567    1472    996.2   22
12/23/2014  5594    1541    1025.4  23
12/24/2014  5621    1610    1054.6  24
12/25/2014  5648    1679    1083.8  25
12/26/2014  5675    1748    1113    26
12/27/2014  5702    1817    1142.2  27
12/28/2014  5729    1886    1171.4  28
12/29/2014  5756    1955    1200.6  29

1 个答案:

答案 0 :(得分:1)

Pandas通过匹配指数进行算术运算。由于您的第二个数据帧来自前一年,因此指数不匹配,因此结果将是NA无处不在。

在进行计算之前,请尝试fc.ix['2015-12-25', 'c2'] / aq.ix['2014-12-25', 'c4'](对于其他数据框也一样)。

编辑:如果您只是尝试比较单个结果而不是完整列,则使用直接索引而不是屏蔽应该没问题。例如,假设您的索引由日期组成,只需使用fc = pd.DataFrame(np.random.rand(6, 4), columns=['c1', 'c2', 'c3', 'c4'], index=pd.date_range('2015-12-20', periods=6, freq='D')) aq = pd.DataFrame(np.random.rand(6, 4), columns=['c1', 'c2', 'c3', 'c4'], index=pd.date_range('2014-12-20', periods=6, freq='D')) result = fc.ix['2015-12-25', 'c2'] / aq.ix['2014-12-25', 'c4'] print(result) # 0.943558115233

{{1}}