【问题标题】:Split a list of tuples in a column of dataframe to columns of a dataframe将数据框列中的元组列表拆分为数据框的列
【发布时间】:2017-06-26 11:23:15
【问题描述】:

我有一个数据框,其中包含一个列中的元组列表。我需要将列表元组拆分为相应的列。我的数据框 df 如下所示:-

          A                                        B
[('Apple',50),('Orange',30),('banana',10)]        Winter   
[('Orange',69),('WaterMelon',50)]                 Summer 

预期的输出应该是:

    Fruit         rate             B
  Apple           50              winter   
  Orange          30              winter   
  banana          10              winter   
  Orange          69              summer   
  WaterMelon      50              summer 

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以将DataFrame 构造函数与numpy.repeatnumpy.concatenate 一起使用:

    df1 = pd.DataFrame(np.concatenate(df.A), columns=['Fruit','rate']).reset_index(drop=True)
    df1['B'] = np.repeat(df.B.values, df['A'].str.len())
    print (df1)
            Fruit rate       B
    0       Apple   50  Winter
    1      Orange   30  Winter
    2      banana   10  Winter
    3      Orange   69  Summer
    4  WaterMelon   50  Summer
    

    chain.from_iterable 的另一个解决方案:

    from  itertools import chain
    
    df1 = pd.DataFrame(list(chain.from_iterable(df.A)), columns=['Fruit','rate'])
            .reset_index(drop=True)
    df1['B'] = np.repeat(df.B.values, df['A'].str.len())
    print (df1)
            Fruit  rate       B
    0       Apple    50  Winter
    1      Orange    30  Winter
    2      banana    10  Winter
    3      Orange    69  Summer
    4  WaterMelon    50  Summer
    

    【讨论】:

      【解决方案2】:

      这应该可行:

      fruits = []
      rates = []
      seasons = []
      
      def create_lists(row):
          tuples = row['A']
          season = row['B']
          for t in tuples:
              fruits.append(t[0])
              rates.append(t[1])
              seasons.append(season)
      
      df.apply(create_lists, axis=1)
      
      new_df = pd.DataFrame({"Fruit" :fruits, "Rate": rates, "B": seasons})[["Fruit", "Rate", "B"]]
      

      输出:

              Fruit  Rate       B
      0       Apple    50  winter
      1      Orange    30  winter
      2      banana    10  winter
      3      Orange    69  summer
      4  WaterMelon    50  summer
      

      【讨论】:

        【解决方案3】:

        您可以在链式操作中执行此操作:

        (
            df.apply(lambda x: [[k,v,x.B] for k,v in x.A],axis=1)
              .apply(pd.Series)
              .stack()
              .apply(pd.Series)
              .reset_index(drop=True)
              .rename(columns={0:'Fruit',1:'rate',2:'B'})
        )
        Out[1036]: 
                Fruit  rate       B
        0       Apple    50  Winter
        1      Orange    30  Winter
        2      banana    10  Winter
        3      Orange    69  Summer
        4  WaterMelon    50  Summer
        

        【讨论】:

          猜你喜欢
          • 2021-11-20
          • 2022-12-22
          • 1970-01-01
          • 1970-01-01
          • 2017-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          相关资源
          最近更新 更多