我有两个csv文件,它们具有相同的列名,但是不同的值。
第一列是索引(time
),其中一个数据列是唯一标识符(id
)
每个csv文件的索引(time
)都不同。
我已经使用read_csv
将数据读入了两个数据框,得到以下结果:
+-------+------+-------+
| id | size | price |
+-------+-------+------+-------+
| time | | | |
+-------+-------+------+-------+
| t0 | ID1 | 10 | 110 |
| t2 | ID1 | 12 | 109 |
| t6 | ID1 | 20 | 108 |
+-------+-------+------+-------+
+-------+------+-------+
| id | size | price |
+-------+-------+------+-------+
| time | | | |
+-------+-------+------+-------+
| t1 | ID2 | 9 | 97 |
| t3 | ID2 | 15 | 94 |
| t5 | ID2 | 13 | 100 |
+-------+-------+------+-------+
我希望创建一个单一的大数据框,其中包含两个数据框的条目,并使用
ffill
从前一时间步骤向前填充值。我可以使用
concat
、sort
和ffill
的组合来实现这一点。但是,首先需要重命名其中一个数据框的列,以避免名称冲突。
df2.columns = [ 'id', 'id2_size', 'id2_price' ]
df = pd.concat([df1, df2]).sort().ffill()
这会导致以下数据框:
+------+------+-------+----------+-----------+
| id | size | price | id2_size | id2_price |
+-------+------+------+-------+----------+-----------+
| time | | | | | |
+-------+------+------+-------+----------+-----------+
| t0 | ID1 | 10 | 110 | nan | nan |
| t1 | ID2 | 10 | 110 | 9 | 97 |
| t2 | ID1 | 12 | 109 | 9 | 97 |
| t3 | ID2 | 12 | 109 | 15 | 94 |
| t5 | ID2 | 12 | 109 | 13 | 100 |
| t6 | ID1 | 20 | 108 | 13 | 100 |
+-------+------+------+-------+----------+-----------+
我的当前方法相当笨拙,因为我必须重命名其中一个数据框的列。
我认为更好的表示数据的方法是使用多级索引,其中第二维的值来自id
列。
生成的数据框将如下所示:
+--------------+--------------+
| ID1 | ID2 |
+------+-------+------+-------+
| size | price | size | price |
+-------+------+-------+------+-------+
| time | | | | |
+-------+------+-------+------+-------+
| t0 | 10 | 110 | nan | nan |
| t1 | 10 | 110 | 9 | 97 |
| t2 | 12 | 109 | 9 | 97 |
| t3 | 12 | 109 | 15 | 94 |
| t5 | 12 | 109 | 13 | 100 |
| t6 | 20 | 108 | 13 | 100 |
+-------+------+-------+------+-------+
这是否可能呢?
如果可以的话,从读取的两个csv数据框转到最终合并的多索引数据框需要哪些步骤呢?
df1.append(df2).set_index(['time','id'])
失败并出现KeyError: u'no item named time'
错误。我认为这是因为time
是索引,而set_index
只考虑列名。如何指定使用现有的索引time
并包括列id
? - Steve Lorimerappend
,它将一列添加到现有索引中。df1.append(fd2).set_index('id', append=True)
- Steve Lorimertime
和id
只是普通列。 你可以通过reset_index()
来实现它,或者像你做的那样。我通常会在这种情况下先使用reset_index
再使用set_index
,这样就能从空白的状态开始建立索引。 - JohnE