【问题标题】:Creating a pandas DataFrame from columns of other DataFrames with similar indexes从具有相似索引的其他 DataFrame 的列中创建 pandas DataFrame
【发布时间】:2014-02-09 11:52:41
【问题描述】:

我有 2 个数据帧 df1 和 df2 具有相同的列名 ['a','b','c'] 并按日期索引。 日期索引可以具有相似的值。 我想创建一个 DataFrame df3,其中仅包含 ['c'] 列中的数据,分别重命名为 'df1' 和 'df2' 并具有正确的日期索引。我的问题是我无法正确合并索引。

df1 = pd.DataFrame(np.random.randn(5,3), index=pd.date_range('01/02/2014',periods=5,freq='D'), columns=['a','b','c'] )
df2 = pd.DataFrame(np.random.randn(8,3), index=pd.date_range('01/01/2014',periods=8,freq='D'), columns=['a','b','c'] )
df1
                 a        b            c
2014-01-02   0.580550    0.480814    1.135899
2014-01-03  -1.961033    0.546013    1.093204
2014-01-04   2.063441   -0.627297    2.035373
2014-01-05   0.319570    0.058588    0.350060
2014-01-06   1.318068   -0.802209   -0.939962

df2
                 a        b            c
2014-01-01   0.772482    0.899337    0.808630
2014-01-02   0.518431   -1.582113    0.323425
2014-01-03   0.112109    1.056705   -1.355067
2014-01-04   0.767257   -2.311014    0.340701
2014-01-05   0.794281   -1.954858    0.200922
2014-01-06   0.156088    0.718658   -1.030077
2014-01-07   1.621059    0.106656   -0.472080
2014-01-08  -2.061138   -2.023157    0.257151

df3 DataFrame 应具有以下形式:

df3
                 df1        df2
2014-01-01   NaN        0.808630
2014-01-02   1.135899   0.323425
2014-01-03   1.093204   -1.355067
2014-01-04   2.035373   0.340701
2014-01-05   0.350060   0.200922
2014-01-06   -0.939962  -1.030077
2014-01-07   NaN        -0.472080
2014-01-08   NaN        0.257151

但在 df1 列中使用 NaN,因为 df2 的日期索引更宽。 (在这个例子中,我会得到以下日期的 NaN:2014-01-01, 2014-01-07 and 2014-01-08

感谢您的帮助。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你可以使用concat:

    In [11]: pd.concat([df1['c'], df2['c']], axis=1, keys=['df1', 'df2'])
    Out[11]: 
                     df1       df2
    2014-01-01       NaN -0.978535
    2014-01-02 -0.106510 -0.519239
    2014-01-03 -0.846100 -0.313153
    2014-01-04 -0.014253 -1.040702
    2014-01-05  0.315156 -0.329967
    2014-01-06 -0.510577 -0.940901
    2014-01-07       NaN -0.024608
    2014-01-08       NaN -1.791899
    
    [8 rows x 2 columns]
    

    axis 参数决定了 DataFrame 的堆叠方式:

    df1 = pd.DataFrame([1, 2, 3])
    df2 = pd.DataFrame(['a', 'b', 'c'])
    
    pd.concat([df1, df2], axis=0)
       0
    0  1
    1  2
    2  3
    0  a
    1  b
    2  c
    
    pd.concat([df1, df2], axis=1)
    
       0  0
    0  1  a
    1  2  b
    2  3  c
    

    【讨论】:

    • 嗨,我对我的数据进行了测试,但出现错误(AssertionError:索引长度与值不匹配)。它似乎不起作用的唯一原因是因为 type(df1['c']) => pandas.core.series.TimeSeries 而在我的数据中它是:pandas.core.series.Series。有什么想法吗?
    • 嗨,我发现了问题:我的数据中有一个重复的行索引,导致 concat 函数引发异常。
    • keys 参数的用途是什么?还有axis?
    • @dopatraman 键使索引/列取决于轴(0 是索引,1 是列)。您会在许多具有相同含义的 pandas 方法中找到轴参数。
    【解决方案2】:

    嗯,我不确定合并是否可行。就我个人而言,我会通过创建日期索引然后使用列表推导构建列来构建一个新的数据框。可能不是最pythonic的方式,但它似乎对我有用!

    import pandas as pd
    import numpy as np
    
    df1 = pd.DataFrame(np.random.randn(5,3), index=pd.date_range('01/02/2014',periods=5,freq='D'), columns=['a','b','c'] )
    df2 = pd.DataFrame(np.random.randn(8,3), index=pd.date_range('01/01/2014',periods=8,freq='D'), columns=['a','b','c'] )
    
    # Create an index list from the set of dates in both data frames
    Index = list(set(list(df1.index) + list(df2.index)))
    Index.sort()
    
    df3 = pd.DataFrame({'df1': [df1.loc[Date, 'c'] if Date in df1.index else np.nan for Date in Index],\
                    'df2': [df2.loc[Date, 'c'] if Date in df2.index else np.nan for Date in Index],},\
                    index = Index)
    
    df3
    

    【讨论】:

      【解决方案3】:

      您要求的是join 操作。 使用how 参数,您可以定义如何处理唯一索引。 在这里,一些article,在这一点上看起来很有帮助。 在下面的示例中,为了简单起见,我省略了化妆品(例如重命名列)。

      代码

      import numpy as np
      import pandas as pd
      df1 = pd.DataFrame(np.random.randn(5,3), index=pd.date_range('01/02/2014',periods=5,freq='D'), columns=['a','b','c'] )
      df2 = pd.DataFrame(np.random.randn(8,3), index=pd.date_range('01/01/2014',periods=8,freq='D'), columns=['a','b','c'] )
      
      df3 = df1.join(df2, how='outer', lsuffix='_df1', rsuffix='_df2')
      print(df3)
      

      输出

                     a_df1     b_df1     c_df1     a_df2     b_df2     c_df2
      2014-01-01       NaN       NaN       NaN  0.109898  1.107033 -1.045376
      2014-01-02  0.573754  0.169476 -0.580504 -0.664921 -0.364891 -1.215334
      2014-01-03 -0.766361 -0.739894 -1.096252  0.962381 -0.860382 -0.703269
      2014-01-04  0.083959 -0.123795 -1.405974  1.825832 -0.580343  0.923202
      2014-01-05  1.019080 -0.086650  0.126950 -0.021402 -1.686640  0.870779
      2014-01-06 -1.036227 -1.103963 -0.821523 -0.943848 -0.905348  0.430739
      2014-01-07       NaN       NaN       NaN  0.312005  0.586585  1.531492
      2014-01-08       NaN       NaN       NaN -0.077951 -1.189960  0.995123
      

      【讨论】:

        猜你喜欢
        • 2018-06-02
        • 2016-02-10
        • 1970-01-01
        • 2019-12-31
        • 2021-12-30
        • 2017-09-02
        • 2021-03-04
        • 2021-12-13
        • 1970-01-01
        相关资源
        最近更新 更多