减去具有不同列类型的pandas中的行

时间:2014-02-21 15:28:48

标签: python pandas

我在数据框(名称:DF)中排序数据,其结构如

      Currency  Date        1Y     2Y     3Y
0     EUR       2013-09-25  0,198  0,307  0,485
1     EUR       2013-09-26  0,204  0,318  0,497
2     USD       2013-09-25  0,306  0,506  0,900
3     USD       2013-09-26  0,706  0,706  1,050

我现在正在尝试计算每一行之间的差异,即在每个连续日期之间取差异,将第一个日期设置为'0' - 为每种货币。我希望得到一个结果,如

      Currency  Date        1Y     2Y     3Y
0     EUR       2013-09-25  0,000  0,000  0,000
1     EUR       2013-09-26  0,006  0,011  0,012
2     USD       2013-09-25  0,000  0,000  0,000
3     USD       2013-09-26  0,400  0,200  0,150

在使用

之前,我看到过类似的问题
DF_diff = DF.set_index('Date').diff()

但在该示例中,实际行中没有涉及字符串,并且没有(在此示例中)货币名称的标准。

我该如何管理?任何帮助都会非常明显。

1 个答案:

答案 0 :(得分:4)

您可以按'Currency'进行分组并应用diff,但首先您需要将数据转换为float,试试这个:

df.loc[:,'1Y':'3Y'] = df.loc[:,'1Y':'3Y'].applymap(lambda x: float(x.replace(",",".")))
df2 = df.set_index('Date').groupby('Currency').apply(lambda x: x.loc[:,'1Y':'3Y'].diff()).fillna(0)
print df2

输出:

               1Y     2Y     3Y
Date                           
2013-09-25      0      0      0
2013-09-26  0.006  0.011  0.012
2013-09-25      0      0      0
2013-09-26    0.4    0.2   0.15

要获得'Currency'并重置索引,您可以执行以下操作:

df2['Currency'] = df.set_index('Date')['Currency']
df2['Date'] = df2.index
df2 = df2.reset_index(drop=True)
df2 = df2[['Currency','Date','1Y','2Y','3Y']]
print df2

输出继电器:

  Currency        Date     1Y     2Y     3Y
0      EUR  2013-09-25      0      0      0
1      EUR  2013-09-26  0.006  0.011  0.012
2      USD  2013-09-25      0      0      0
3      USD  2013-09-26    0.4    0.2   0.15