代码之家  ›  专栏  ›  技术社区  ›  KorbenDose

将dataframe列值转换为新列

  •  6
  • KorbenDose  · 技术社区  · 6 年前

    我有一个包含一些数据的数据框,我想对其进行转换,以便一列的值定义新列。

    >>> import pandas as pd
    >>> df = pd.DataFrame([['a','a','b','b'],[6,7,8,9]]).T
    >>> df
       A  B
    0  a  6
    1  a  7
    2  b  8
    3  b  9
    

    列的值 A 应为新数据帧的列名。转换的结果应该如下所示:

       a  b
    0  6  8
    1  7  9
    

    到目前为止,我的想法并没有完全奏效:

    >>> pd.DataFrame({ k : df.loc[df['A'] == k, 'B'] for k in df['A'].unique() })
         a    b
    0    6  NaN
    1    7  NaN
    2  NaN    8
    3  NaN    9
    

    除此之外,我想还有一个更有效的方法。我真的很难理解如何对待熊猫。

    3 回复  |  直到 6 年前
        1
  •  4
  •   harvpan    6 年前

    你就快到了但你需要 .values 作为数组的列表,然后提供列名。

    pd.DataFrame(pd.DataFrame({ k : df.loc[df['A'] == k, 'B'].values for k in df['A'].unique() }), columns=df['A'].unique())
    

    输出:

        a   b
    0   6   8
    1   7   9
    
        2
  •  1
  •   Scott Boston    6 年前

    使用 set_index , groupby , cumcount unstack :

    (df.set_index(['A', df.groupby('A').cumcount()])['B']
       .unstack(0)
       .rename_axis([None], axis=1))
    

    输出:

       a  b
    0  6  8
    1  7  9
    
        3
  •  1
  •   jpp    6 年前

    使用字典理解 groupby :

    res = pd.DataFrame({col: vals.loc[:, 1].values for col, vals in df.groupby(0)})
    
    print(res)
    
       a  b
    0  6  8
    1  7  9