【问题标题】:How to Covert multiple list columns in data frame into given one? [duplicate]如何将数据框中的多个列表列转换为给定的列? [复制]
【发布时间】:2019-06-01 21:43:06
【问题描述】:

我有这样的数据框

     Number      String            Aut
  0 [12, 13]    [hi are, ho to]    ppppp
  1   34         How               qqqqq
  2   35         are               wwwwwww

我想把这个变成这个

         Number      String            Aut
  0   12          hi are            ppppp
  1   13          ho to             ppppp
  2   34          How               qqqqq
  3   35          are               wwwwwww

我试过了,但没用 ref

res = df.set_index(['Aut'])['Number', 'String'].apply(pd.Series).stack()

我们将不胜感激。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    有标量混合列表,所以首先需要一些预处理,然后通过chainrepeat创建DataFrame:

    n = [x if isinstance(x, list) else [x] for x in df['Number']]
    s = [x if isinstance(x, list) else [x] for x in df['String']]
    lens = [len(x) for x in n]
    
    from itertools import chain
    
    df = pd.DataFrame({
        'Number' : list(chain.from_iterable(n)), 
        'String' : list(chain.from_iterable(s)), 
        'Aut' : df['Aut'].values.repeat(lens)
    })
    print (df)
       Number  String      Aut
    0      12  hi are    ppppp
    1      13   ho to    ppppp
    2      34     How    qqqqq
    3      35     are  wwwwwww
    

    【讨论】:

      【解决方案2】:

      这可以分两步完成:

      step1_df=df.set_index('Aut').String.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'String'}) 
      
      step2_df=df.set_index('Aut').Number.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'Number'})
      

      合并两个df:

       final=pd.merge(step1_df,step2_df,on="Aut")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-04
        • 2021-01-08
        • 2013-07-26
        • 2021-01-14
        • 2021-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多