通过计算附加到另一个的数据框

时间:2014-04-28 15:17:07

标签: python pandas

我读了2个csv文件并从中创建了2个数据帧。

我正在使用第二个数据帧并使用它进行一些计算以附加到第一个数据帧。但是,我似乎没有附加到第一个数据框的内容实际发生。

要使这一点正确,我需要做些什么?

以下是我正在使用的代码:

import pandas as pd

m = pd.read_csv('DailyHistoricData.csv', header = None, index_col=0)
f = pd.read_csv('ImportFMP.csv', header = None)

for index in range(len(f)):
    a0 = f.ix[index, 0]
    a1 = f.ix[index, 1]
    a2 = f.ix[index, 7]
    a3 = f.ix[index, 8]-f.ix[index, 9]
    a4 = 100*f.ix[index, 2]
    a5 = f.ix[index, 10]-f.ix[index, 11]
    a6 = f.ix[index, 3]
    a7 = f.ix[index, 4]
    a8 = f.ix[index, 5]
    a9 = f.ix[index, 6]
    m.append([a0, a1, a2, a3, a4, a5, a6, a7, a8, a9])



print m.tail(3)

f的信息是:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 720 entries, 0 to 719
Data columns (total 12 columns):
0     720 non-null int64
1     720 non-null int64
2     720 non-null float64
3     720 non-null int64
4     720 non-null int64
5     720 non-null int64
6     720 non-null int64
7     720 non-null int64
8     720 non-null int64
9     720 non-null int64
10    720 non-null float64
11    720 non-null int64
dtypes: float64(2), int64(10)None

前5行数据是:

       0         1     2     3     4     5     6      7     8     9    10   11
0  11541  20110118  1.55  1296  1290  1295  1334  11838  1646  1393  525  687
1  11542  20110119  2.46  1295  1279  1282  1337  11825   697  2358  115  958
2  11543  20110120  0.70  1283  1271  1280  1312  11822  1141  1892  547  632
3  11544  20110121  0.83  1291  1282  1283  1310  11871  1597  1438  717  535
4  11545  20110124  1.23  1292  1282  1291  1304  11980  2143   904  628  325

m信息是:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 11544 entries, 1 to 11544
Data columns (total 19 columns):
1     11544 non-null int64
2     11544 non-null float64
3     11544 non-null int64
4     11544 non-null float64
5     11544 non-null float64
6     11544 non-null float64
7     11544 non-null float64
8     11544 non-null float64
9     11544 non-null int64
10    11544 non-null float64
11    11544 non-null float64
12    11544 non-null float64
13    11544 non-null int64
14    11544 non-null float64
15    11544 non-null float64
16    11544 non-null float64
17    11544 non-null int64
18    11544 non-null float64
19    11544 non-null int64
dtypes: float64(13), int64(6)None

m的前5行数据是:

          1       2    3   4     5   6   7   8   9   10  11  12  13  14  15  \
0                                                                            
1  19650302  507.99   70  56  1.77   0   0   0   0   0   0   0   0   0   0   
2  19650303  507.35   46  73  1.07   0   0   0   0   0   0   0   0   0   0   
3  19650304  505.94 -104  96 -0.39   0   0   0   0   0   0   0   0   0   0   
4  19650305  504.76 -200  66  0.14   0   0   0   0   0   0   0   0   0   0   
5  19650308  504.86  160  89  0.90   0   0   0   0   0   0   0   0   0   0   

    16  17  18  19  
0                  
1   0   0   0   1  
2   0   0   0   2  
3   0   0   0   3  
4   0   0   0   4  
5   0   0   0   5  

1 个答案:

答案 0 :(得分:2)

你应该对此进行矢量化:

In [68]: a3 = f.iloc[:, 8] - f.iloc[:, 9]

In [69]: a4 = 100 * f.iloc[:, 2]

In [70]: a5 = f.iloc[:, 10] - f.iloc[:, 11]

In [71]: toappend = pd.concat([a3, a4, a5], axis=1).rename(columns=dict(zip(range(3), list('abc'))))

In [72]: toappend.tail()
Out[72]:
        a    b    c
715 -1147  100 -247
716 -1022   89 -200
717  1491  109  328
718   712   87  194
719  -335   97  -84

[5 rows x 3 columns]

In [73]: res = m.append(f.iloc[:, [0, 3, 4, 5, 1, 6, 7]].join(toappend))

In [74]: res.tail()[['a', 'b', 'c']]
Out[74]:
        a    b    c
715 -1147  100 -247
716 -1022   89 -200
717  1491  109  328
718   712   87  194
719  -335   97  -84

[5 rows x 3 columns]

一般来说,如果你发现自己编写的循环的主体包含逐元素的算术运算,你很可能能够对整个向量/ Series对象进行操作并利用numpy在这方面的速度。