在 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 数据帧)