3

我有一个 DataFrame df1(作为日期时间的索引)和df2许多列,不同长度的索引。
我需要结合df1df2替换索引df2。结果提出来df3

df1
                      T1
2011-09-01 00:00:00   10
2011-09-01 00:10:00   20
2011-09-01 00:20:00   30  
2011-09-01 00:30:00   40

df2
    T2   T3        
0   1.1  2.0 
1   1.2  3.0
2   1.3  4.0

df3
                      T1   T2  T3
2011-09-01 00:00:00   10  1.1  2.0
2011-09-01 00:10:00   20  1.2  3.0
2011-09-01 00:20:00   30  1.3  4.0
2011-09-01 00:30:00   40  Nan  Nan

我想尝试concat, join, merge, append,但那些似乎不合适。
使用set_index导致出现错误:长度不匹配。

我最终尝试了这个:

  df3=pd.DataFrame(df2,index=df1.index,copy=True)

我得到了所需的索引和列,df2但它们是空的。

4

2 回答 2

5

这是一种方法:

In [32]: from pandas import DataFrame, date_range, concat

In [33]: from numpy.random import randn

In [34]: df = DataFrame(randn(5, 1), index=date_range('20010101', periods=5), columns=['A'])

In [35]: df2 = DataFrame(randn(3, 2), columns=list('BC'))

In [36]: concat([df, df2.set_index(df.index[:len(df2)])], axis=1)
Out[36]:
                A      B      C
2001-01-01 -0.043  0.759 -0.125
2001-01-02 -1.377  0.895  0.629
2001-01-03  0.263 -0.007 -0.515
2001-01-04  1.546    NaN    NaN
2001-01-05 -0.657    NaN    NaN

您也可以使用DataFrame.join()稍短的代码来执行此操作:

In [7]: df.join(df2.set_index(df.index[:len(df2)]))
Out[7]:
                A      B      C
2001-01-01 -0.607 -0.038  0.593
2001-01-02  0.573  0.399 -0.627
2001-01-03  0.319  0.312 -0.152
2001-01-04 -1.671    NaN    NaN
2001-01-05 -1.589    NaN    NaN
于 2013-08-22T21:57:56.187 回答
0

只是为了抛弃另一种(hacky)方法,这个修改了df1

In [11]: df1[df2.columns] = np.nan

In [12]: df1
Out[12]:
                     T1  T2  T3
2011-09-01 00:00:00  10 NaN NaN
           00:10:00  20 NaN NaN
           00:20:00  30 NaN NaN
           00:30:00  40 NaN NaN

In [13]: df1.iloc[:len(df2.index), -len(df2.columns):] = df2.values

In [14]: df1
Out[14]:
                     T1   T2  T3
2011-09-01 00:00:00  10  1.1   2
           00:10:00  20  1.2   3
           00:20:00  30  1.3   4
           00:30:00  40  NaN NaN

注意:如果您有重复的列名,这将被绊倒。

但是,我更喜欢@PhilipClouds 的方法。

于 2013-08-22T22:24:24.883 回答