pandas数据组合

数据组合常用的方法有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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球