【问题标题】:How to loop through series to produce a data frame and add columns to it?如何循环遍历系列以生成数据框并向其中添加列?
【发布时间】:2019-08-02 17:37:26
【问题描述】:

我有一堆系列想要堆叠,制作一个数据框,然后通过相同的过程将其他系列添加到该数据框。

我在 jupyter notebook 中一步一步地完成了它,但是当我尝试在 jupyter notebook 中创建一个 for 语句和一个函数来做我可以做的事情(逐步)时,程序失败给我一个错误。

代码

import pandas as pd

data = {'sum':[140.0, 45.0, 17907.0], 'mean':[35.00, 11.25, 4476.75],'count':[4, 4, 4]}
df = pd.DataFrame(data, index=['age', 'offspring', 'total_pop'])
data2 = {'sum':[14.0, 46.0, 14607.0], 'mean':[345.00, 121.25, 5476.75], 'count':[2, 2, 2]}
df2 = pd.DataFrame(data2, index=['age', 'offspring', 'total_pop'])
data3 = {'sum':[528.0, 15.0, 1407.0], 'mean':[700.00, 552.25, 4156.75], 'count':[3, 3, 3]}
df3 = pd.DataFrame(data3, index=['age', 'offspring', 'total_pop'])

def dosomething(df):
        stacked = df.stack()
        df = pd.Series(stacked)
        df.to_frame()
        dfd = pd.DataFrame(df)
        df = df.join(dfd)
        print(dfd)

total_df = [(df1), (df2), (df3,)]

for n in range(0, len(total_df)):
        total_df[n] = dosomething(total_df[n])

预期

                      1         2        3
age       sum      140.00     14.00   528.00
          mean      35.00    345.00   700.00
          count      4.00      2.00     3.00
offspring sum       45.00     46.00    15.00
          mean      11.25    121.25   552.25
          count      4.00      2.00     3.00
total_pop sum    17907.00  14607.00  1407.00
          mean    4476.75   5476.75  4156.75
          count      4.00      2.00     3.00

实际错误

ValueError:列重叠但未指定后缀:RangeIndex(start=0, stop=1, step=1)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    试试concat:

    dfs = [df,df2, df3]
    pd.concat([df.stack() for df in dfs], axis=1)
    

    输出:

                            0         1        2
    age       sum      140.00     14.00   528.00
              mean      35.00    345.00   700.00
              count      4.00      2.00     3.00
    offspring sum       45.00     46.00    15.00
              mean      11.25    121.25   552.25
              count      4.00      2.00     3.00
    total_pop sum    17907.00  14607.00  1407.00
              mean    4476.75   5476.75  4156.75
              count      4.00      2.00     3.00
    

    【讨论】:

      【解决方案2】:

      如果您不需要循环,这将起作用:

      # stack dataframes
      df = pd.DataFrame(df.stack(), columns=[1])
      df2 = pd.DataFrame(df2.stack(), columns=[2])
      df3 = pd.DataFrame(df3.stack(), columns=[3])
      
      #join on index
      final_df = df.join(df2).join(df3)
      

      如果你需要使用循环,你可以这样做:

      # stack first df
      final_df = pd.DataFrame(df.stack(), columns=[1])
      # loop through other dfs
      for n, next_df in {2: df2, 3: df3}.items():
          next_df = pd.DataFrame(next_df.stack(), columns=[n])
          final_df = final_df.join(next_df)
      

      【讨论】:

        【解决方案3】:

        您可以使用pd.concat 和选项keys 在最后的df 上执行单个stack,而不是每个stack 每个df

        df_list = [df, df2, df3]
        pd.concat(df_list, keys=range(len(df_list)), axis=1).stack()
        
        Out[127]:
                                0         1        2
        age       sum      140.00     14.00   528.00
                  mean      35.00    345.00   700.00
                  count      4.00      2.00     3.00
        offspring sum       45.00     46.00    15.00
                  mean      11.25    121.25   552.25
                  count      4.00      2.00     3.00
        total_pop sum    17907.00  14607.00  1407.00
                  mean    4476.75   5476.75  4156.75
                  count      4.00      2.00     3.00
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-11
          • 2018-03-16
          • 1970-01-01
          • 2013-08-22
          • 2014-10-19
          • 1970-01-01
          • 2019-08-20
          • 1970-01-01
          相关资源
          最近更新 更多