我试图在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
答案 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}}