【问题标题】:How to join several data frames containing different pieces of one data into one?如何将包含一个数据的不同部分的多个数据帧合并为一个?
【发布时间】:2019-10-01 14:16:38
【问题描述】:

我有几个 - 比如说三个 - 包含另一个数据帧的不同行(有时它们可​​以重叠)的数据帧。所有三个 dfs 的列都是相同的。我现在想创建最终数据框,其中包含三个提到的数据框的所有行。此外,我需要为最终的 df 生成一列,其中包含包含该特定行的前三个 df 之一的信息。

以下示例

原始数据框:

 original_df = pd.DataFrame(np.array([[1,1],[2,2],[3,3],[4,4],[5,5],[6,6]]), columns = ['label1','label2'])

三个 dfs 包含原始 df 的不同部分:

a = original_df.loc[0:1, columns]
b = original_df.loc[2:2, columns]
c = original_df.loc[3:, columns]

我想得到如下数据框:

final_df = pd.DataFrame(np.array([[1,1,'a'],[2,2,'a'],[3,3,'b'],[4,4,'c'],\
[5,5,'c'],[6,6,'c']]), columns = ['label1','label2', 'from which df this row'])

或者简单地使用整数来标记该行来自哪个df:

final_df = pd.DataFrame(np.array([[1,1,1],[2,2,1],[3,3,2],[4,4,3],\
[5,5,3],[6,6,3]]), columns = ['label1','label2', 'from which df this row'])

提前谢谢你!

【问题讨论】:

    标签: python-3.x pandas numpy dataframe


    【解决方案1】:

    See this related post

    IIUC,您可以将pd.concatkeysnames 参数一起使用

    pd.concat(
        [a, b, c], keys=['a', 'b', 'c'],
        names=['from which df this row']
    ).reset_index(0)
    
      from which df this row  label1  label2
    0                      a       1       1
    1                      a       2       2
    2                      b       3       3
    3                      c       4       4
    4                      c       5       5
    5                      c       6       6
    

    但是,我建议您将这些数据框片段存储在字典中。

    parts = {
        'a': original_df.loc[0:1],
        'b': original_df.loc[2:2],
        'c': original_df.loc[3:]
    }
    
    pd.concat(parts, names=['from which df this row']).reset_index(0)
    
      from which df this row  label1  label2
    0                      a       1       1
    1                      a       2       2
    2                      b       3       3
    3                      c       4       4
    4                      c       5       5
    5                      c       6       6
    

    而且只要存储为字典,也可以像这样使用assign

    pd.concat(d.assign(**{'from which df this row': k}) for k, d in parts.items())
    
       label1  label2 from which df this row
    0       1       1                      a
    1       2       2                      a
    2       3       3                      b
    3       4       4                      c
    4       5       5                      c
    5       6       6                      c
    

    请记住,我使用了双拼**,因为您有一个带有空格的列名。如果你有一个没有空格的列名,我们可以这样做

    pd.concat(d.assign(WhichDF=k) for k, d in parts.items())
    
       label1  label2 WhichDF
    0       1       1       a
    1       2       2       a
    2       3       3       b
    3       4       4       c
    4       5       5       c
    5       6       6       c
    

    【讨论】:

      【解决方案2】:

      只需创建一个列表并最后连接:

      list_df = []
      list_df.append(df1)
      list_df.append(df2)
      list_df.append(df3)
      df = pd.concat(liste_df)
      

      【讨论】:

        【解决方案3】:

        也许这可以为您工作/增加价值:)

        import pandas as pd
        
        # from your post
        a = original_df.loc[0:1, columns]
        b = original_df.loc[2:2, columns]
        c = original_df.loc[3:, columns]
        
        # create new column to label the datasets
        a['label'] = 'a'
        b['label'] = 'b'
        c['label'] = 'c'
        
        # add each df to a list
        combined_l = []
        combined_l.append(a)
        combined_l.append(b)
        combined_l.append(c)
        
        # concat all dfs into 1
        df = pd.concat(liste_df)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-31
          • 2022-01-22
          • 2020-07-28
          相关资源
          最近更新 更多