数据组合常用的方法有concat方法、append方法和merge方法,根据数据的特点不同,有不同的连接方式。
1、添加行
通过concat方法添加行,列相同时添加的行会在原来的列下面链接,列不相同时新的dataframe数据的列是被连接的列的并集。缺失的值用NaN填充。 注:concat是pandas顶层的方法,调用时需要通过pandas来调用。
列相同时:
pf = pd.DataFrame(np.arange(15).reshape(5,3),
index=list('ABCDE'),columns=['one','two','three'])
pf1 = pf.iloc[:3]
pf2 = pf.iloc[3:]
print(pf1)
print(pf2)
row_concat = pd.concat([pf1,pf2])
print(row_concat)
打印如下:
one two three
A 0 1 2
B 3 4 5
C 6 7 8
one two three
D 9 10 11
E 12 13 14
one two three
A 0 1 2
B 3 4 5
C 6 7 8
D 9 10 11
E 12 13 14
列不相同时:
pf = pd.DataFrame(np.arange(15).reshape(5,3),
index=list('ABCDE'),columns=['one','two','three'])
pf1 = pf.iloc[:3]
pf1.columns = ['one','two','four']
pf2 = pf.iloc[3:]
print(pf1)
print(pf2)
row_concat = pd.concat([pf1,pf2])
print(row_concat)
打印如下:`
one two four
A 0 1 2
B 3 4 5
C 6 7 8
one two three
D 9 10 11
E 12 13 14
one two four three
A 0 1 2.0 NaN
B 3 4 5.0 NaN
C 6 7 8.0 NaN
D 9 10 NaN 11.0
E 12 13 NaN 14.0
上图中three列的前三行和four列的后两行都是NaN值填充的。
也可以用append方法,用append方法时,不同列缺少的值也会用NaN填充。。
pf = pd.DataFrame(np.arange(15).reshape(5,3),
index=list('ABCDE'),columns=['one','two','three'])
pf1 = pf.iloc[:3]
pf2 = pd.DataFrame(np.arange(8).reshape(2,4),columns=['one','two','three','four'])
print(pf1.append(pf2))
打印如下:
one two three four
A 0 1 2 NaN
B 3 4 5 NaN
C 6 7 8 NaN
0 0 1 2 3.0
1 4 5 6 7.0
append也可以添加Python字典类型的数据,需要指定ignore_idex=True参数。指定ignore_idex=True参数后连接的dataframe数据没有原来的索引值,生成新的从0开始的数字索引。
pf = pd.DataFrame(np.arange(15).reshape(5,3),
index=list('ABCDE'),columns=['one','two','three'])
pf1 = pf.iloc[:3]
d = {'one': 'a', 'two': 'b', 'three': 'c'}
print(pf1.append(d,ignore_index=True))
打印如下:
one two three
0 0 1 2
1 3 4 5
2 6 7 8
3 a b c
2、添加列
添加列与添加行类似,主要区别是在concat函数中指定轴参数。axis参数的默认值是0,按行连接。按列添加时指定axis的参数为1,将按列连接数据。
pf = pd.DataFrame(np.arange(15).reshape(5,3),columns=['one','two','three'])
pf1 = pf.iloc[:3]
pf2 = pd.DataFrame(np.arange(8).reshape(2,4),columns=['one','two','three','four'])
print(pd.concat([pf1,pf2],axis=1))
打印如下:
one two three one two three four
0 0 1 2 0.0 1.0 2.0 3.0
1 3 4 5 4.0 5.0 6.0 7.0
2 6 7 8 NaN NaN NaN NaN
添加一列时无需使用任何pandas函数,提供一个列名,并赋以想添加的列即可实现。
pf = pd.DataFrame(np.arange(15).reshape(5,3),columns=['one','two','three'])
pf['four'] = ['a4','b4','c4','d4','e4']
print(pf)
输出如下:
one two three four
0 0 1 2 a4
1 3 4 5 b4
2 6 7 8 c4
3 9 10 11 d4
4 12 13 14 e4
four列的值顺利添加进来了。
3、不同索引下的连接操作
前面的例子都是有相同的行索引和列索引时连接,如果行索引和列索引都不同时,连接后的dataframe数据将会在值缺失的地方产生很多NaN值。
pf1 = pd.DataFrame(np.arange(15).reshape(5,3),index=range(5),columns=['one','two','three'])
pf2 = pd.DataFrame(np.arange(8).reshape(2,4),index=range(6,8),columns=list('ABCD'))
print(pd.concat([pf1,pf2]))
打印如下:
one two three A B C D
0 0.0 1.0 2.0 NaN NaN NaN NaN
1 3.0 4.0 5.0 NaN NaN NaN NaN
2 6.0 7.0 8.0 NaN NaN NaN NaN
3 9.0 10.0 11.0 NaN NaN NaN NaN
4 12.0 13.0 14.0 NaN NaN NaN NaN
6 NaN NaN NaN 0.0 1.0 2.0 3.0
7 NaN NaN NaN 4.0 5.0 6.0 7.0
为了避免包含NaN值,可保留要连接的列共有的列,concat函数有一个join参数,默认join参数值为outter,意味着它会保留所有的列。指定join参数为inner时,只保留数据集都有的列(排除包含NaN值的列)。
这时要保留两个dataframe数据共有的列将会产生一个空值。
pf1 = pd.DataFrame(np.arange(15).reshape(5,3),index=range(5),columns=['one','two','three'])
pf2 = pd.DataFrame(np.arange(8).reshape(2,4),index=range(7,9),columns=list('ABCD'))
print(pd.concat([pf1,pf2],ignore_index=True,join='inner'))
打印如下:
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, 4, 5, 6]
4、合并多个数据集
前面的例子都是基于行索引或者列索引来合并数据的。当通过dataframe数据中的某列来合并数据时可以使用merge函数。列中不可以含有重复值。
pf1 = pd.read_excel(r'.\test1.xlsx')
pf2 = pd.read_excel(r'.\test2.xlsx')
print(pf1)
print(pf2)
new_pf = pf1.merge(pf2,left_on=['学号','姓名'],right_on=['number','name'])
print(new_pf)
打印如下:
学号 姓名 成绩
0 20200019 陈俊 98
1 20200021 陈利 89
2 20200022 周睫 96
3 20200023 张凯 92
number name sex age
0 20200022 周睫 NaN 19
1 20200021 陈利 男 18
2 20200019 陈俊 男 19
3 20200023 张凯 男 19
学号 姓名 成绩 number name sex age
0 20200019 陈俊 98 20200019 陈俊 男 19
1 20200021 陈利 89 20200021 陈利 男 18
2 20200022 周睫 96 20200022 周睫 NaN 19
3 20200023 张凯 92 20200023 张凯 男 19
Original: https://blog.csdn.net/weixin_46620651/article/details/112253176
Author: 随便叫个啥~!
Title: pandas数据组合
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/740847/
转载文章受原作者版权保护。转载请注明原作者出处!