【问题标题】:Turn series to dataframe with certain dimension将系列转换为具有特定维度的数据框
【发布时间】:2017-11-07 09:50:50
【问题描述】:

我有一个 5 值的系列

    0 A
    1 A
    2 B
    3 C
    4 E

我有一个包含 n 列的数据框 A。

有什么方法可以制作尺寸为 (5*n) 的数据框。所有列均由系列组成,列名与数据框 A 相同?

例如:

数据框 A 看起来像

      col1    col2
0        1       3
1        2       2
2        2       2
3        2       6
4        4       2

新的数据框看起来像

      col1    col2
0        A       A
1        A       A
2        B       B
3        C       C
4        E       E

我现在想出的最佳解决方案是复制 A 并使用循环逐列更改新数据框的值。

感谢您的帮助!

【问题讨论】:

    标签: python pandas dataframe series


    【解决方案1】:

    使用concat:

    df = pd.concat([s] * len(df.columns), 1, keys=df.columns)
    print (df)
      col1 col2
    0    A    A
    1    A    A
    2    B    B
    3    C    C
    4    E    E
    

    或者如果需要更快的解决方案,请使用numpy.repeat + numpy.reshape:

    l = len(df.columns)
    df = pd.DataFrame(np.repeat(s,l ).reshape(-1,l), columns=df.columns, index=df.index)
    print (df)
      col1 col2
    0    A    A
    1    A    A
    2    B    B
    3    C    C
    4    E    E
    

    或者更简单:

    l = len(df.columns)
    df = pd.DataFrame(np.column_stack([s] * l), columns=df.columns, index=df.index)
    print (df)
      col1 col2
    0    A    A
    1    A    A
    2    B    B
    3    C    C
    4    E    E
    

    时间安排

    np.random.seed(123)
    
    L = list('abcdefghijklmno') 
    s = pd.Series(np.random.choice(L, 100))
    
    df = pd.DataFrame(np.random.randint(100, size=(100, 100))).add_prefix('col')
    
    print (df)
    
    In [161]: %timeit pd.concat([s] * len(df.columns), 1, keys=df.columns)
    100 loops, best of 3: 2.84 ms per loop
    
    In [162]: %timeit pd.DataFrame(np.repeat(s.values,len(df.columns)).reshape(-1,len(df.columns)), columns=df.columns, index=df.index)
    1000 loops, best of 3: 199 µs per loop
    
    In [163]: %timeit pd.DataFrame(np.column_stack([s] * len(df.columns)), columns=df.columns, index=df.index)
    1000 loops, best of 3: 1 ms per loop
    
    In [164]: %timeit pd.DataFrame({k : s for k in df.columns})
    100 loops, best of 3: 2.33 ms per loop
    

    【讨论】:

      【解决方案2】:

      DataFrame 带有 dict 组合的构造函数。

      pd.DataFrame({k : df1.Col for k in df2.columns})
      
        col1 col2
      0    A    A
      1    A    A
      2    B    B
      3    C    C
      4    E    E
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-23
        • 2019-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 2021-11-21
        • 1970-01-01
        相关资源
        最近更新 更多