在 Python 中合并 Pandas 数据帧

Posted

技术标签:

【中文标题】在 Python 中合并 Pandas 数据帧【英文标题】:Merge Pandas DataFrames in Python 【发布时间】:2016-10-17 18:00:03 【问题描述】:

我有两个熊猫数据框。第一个包含 3401 行 1 列,第二个是 4 行 3 列。

但我得到的是(我的脚本的示例输出):

 DataFrame1      |     DataFrame2 

 - email1        |     -Id1  -Project1 -Descr1
 - email2        |     -Id2  -Project2 -Descr2
 - email3        |     -Id3  -Project3 -Descr3
 - email4        |     -Id4  -Project4 -Descr4
 - email5        |     -None -None     -None 
  ... ....       |      ... ...   
 - email3401     |     -None -None     -None

我想做的是对于每封邮件,我都想得到类似的东西:

 - mail1, Id1, Project1, Descr1, Id2, Project2, ... , Id4, Project4, Descr4
 - mail2, Id1, Project1, Descr1, Id2, Project2, ... , Id4, Project4, Descr4
 ... ...
 - mail3401, Id1, Project1, Descr1, Id2, Project2, ... , Id4, Project4, Descr4 

感谢您的建议!

这是我的代码:

     path = r"/Users/kd/path"
     allFiles = glob.glob(path + "/*.csv")
     frame = pd.DataFrame()
     file_names = []
     j=0
     for file_ in allFiles:
         name = os.path.splitext(file_)[0]
         i = int(name[-1])
         file_names.append(name)
         df = pd.read_csv(file_, index_col = None, header = 0)
         if j>0:
            globals()["self.dfInternautes%s"%i] =   pd.concat([globals(["self.dfInternautes%s"%i], df], axis=1)
         else: 
            globals()["self.dfInternautes%s"%i] = df
         j += 1

【问题讨论】:

所以你希望除了第一列 (mail1, mail2, ...) 之外的所有行都相同 (Id1, Project1, Descr1, Id2, Project2, ... , Id4, Project4, Descr4)? @IanS 是的,这正是我想要的! 【参考方案1】:

要从 DataFrame 中创建一行,请使用 stack。然后迭代它在第一个 DataFrame 中创建新列。

>>> df1
        0
0  email1
1  email2
2  email3
3  email4
4  email5
5  email6
>>> df2
     0         1       2
0  Id1  Project1  Descr1
1  Id2  Project2  Descr2
2  Id3  Project3  Descr3
3  Id4  Project4  Descr4
>>> st = df2.stack()
>>> st
0  0         Id1
   1    Project1
   2      Descr1
1  0         Id2
   1    Project2
   2      Descr2
2  0         Id3
   1    Project3
   2      Descr3
3  0         Id4
   1    Project4
   2      Descr4
dtype: object
>>> df = df1.copy()
>>> for i in st.index: df[i] = st[i]
... 
>>> df
        0 (0, 0)    (0, 1)  (0, 2) (1, 0)    (1, 1)  (1, 2) (2, 0)    (2, 1)  \
0  email1    Id1  Project1  Descr1    Id2  Project2  Descr2    Id3  Project3   
1  email2    Id1  Project1  Descr1    Id2  Project2  Descr2    Id3  Project3   
2  email3    Id1  Project1  Descr1    Id2  Project2  Descr2    Id3  Project3   
3  email4    Id1  Project1  Descr1    Id2  Project2  Descr2    Id3  Project3   
4  email5    Id1  Project1  Descr1    Id2  Project2  Descr2    Id3  Project3   
5  email6    Id1  Project1  Descr1    Id2  Project2  Descr2    Id3  Project3   

   (2, 2) (3, 0)    (3, 1)  (3, 2)  
0  Descr3    Id4  Project4  Descr4  
1  Descr3    Id4  Project4  Descr4  
2  Descr3    Id4  Project4  Descr4  
3  Descr3    Id4  Project4  Descr4  
4  Descr3    Id4  Project4  Descr4  
5  Descr3    Id4  Project4  Descr4  

可选择更改列名

df.columns = ['email', 'Id1', 'Project1', 'Descr1', 'Id2', 'Project2', 'Descr2', 'Id3', 'Project3', 'Descr3', 'Id4', 'Project4', 'Descr4']

【讨论】:

以上是关于在 Python 中合并 Pandas 数据帧的主要内容,如果未能解决你的问题,请参考以下文章

合并两个不同长度的python pandas数据帧,但将所有行保留在输出数据帧中

将没有唯一索引的数据帧与 Python 和 Pandas 合并 [重复]

Python pandas:合并两个没有键的表(将 2 个数据帧与广播所有元素相乘;NxN 数据帧)

在 Pandas 中合并索引上的数据帧更有效

Python Pandas - 发布 concat 多索引数据帧

Pandas:如何将两个不完整的数据帧合并或合并为一个完整的数据帧