4. DataFrame 级联操作

concat()函数可以对Series,DataFrame按轴进行级联操作,axis参数默认是0,在行上进行连接,axis设置为1,则是在列上进行连接, 函数定义如下

def concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
           keys=None, levels=None, names=None, verify_integrity=False,
           sort=None, copy=True):

本文以DataFrame进行讲解

1. 连接

import pandas as pd

data1 = {
    '语文': [90, 98, 87, 90],
    '数学': [92, 87, 90, 98]
}

df1 = pd.DataFrame(data1, index=['小明', '小红', '小刚', '小丽'])

data2 = {
    '语文': [98, 95, 80, 98],
    '数学': [94, 92, 88, 94]
}

df2 = pd.DataFrame(data2, index=['小林', '小李', '小张', '小王'])

df = pd.concat([df1, df2])
print(df)

程序输出结果

    语文  数学
小明  90  92
小红  98  87
小刚  87  90
小丽  90  98
小林  98  94
小李  95  92
小张  80  88
小王  98  94

使用concat函数对数据进行连接时, objs参数传入的是列表,本示例中,列表里只有两个DataFrame,但你可以传入更多的。

2. axis

决定按哪个轴进行连接,默认是0,这样进行连接,相当于进行了append操作

df = df1.append(df2)
print(df)

df1.append(df2)返回的数据与第1小结中使用concat函数连接的结果是一样的。

当axis等于1时,是在列上进行连接

import pandas as pd

data1 = {
    '语文': [90, 98, 87, 90],
    '数学': [92, 87, 90, 98]
}

df1 = pd.DataFrame(data1, index=['小明', '小红', '小刚', '小丽'])

data2 = {
    '物理': [98, 95, 80, 98],
    '生物': [94, 92, 88, 94]
}

df2 = pd.DataFrame(data2, index=['小明', '小红', '小刚', '小王'])

df = pd.concat([df1, df2], axis=1)
print(df)

程序输出结果

      语文    数学    物理    生物
小丽  90.0  98.0   NaN   NaN
小刚  87.0  90.0  80.0  88.0
小明  90.0  92.0  98.0  94.0
小王   NaN   NaN  98.0  94.0
小红  98.0  87.0  95.0  92.0

小丽没有物理和生物的成绩, 小王没有语文和数学的成绩,这些缺失的值使用np.nan代替。

3. join

在第2小节中,axis设置为1时,在列的层面上进行连接操作,join参数默认是outter, 如果改成inner,则结果完全不一样

import pandas as pd

data1 = {
    '语文': [90, 98, 87, 90],
    '数学': [92, 87, 90, 98]
}

df1 = pd.DataFrame(data1, index=['小明', '小红', '小刚', '小丽'])

data2 = {
    '物理': [98, 95, 80, 98],
    '生物': [94, 92, 88, 94]
}

df2 = pd.DataFrame(data2, index=['小明', '小红', '小刚', '小王'])

df = pd.concat([df1, df2], axis=1, join='inner')
print(df)

程序输出结果

    语文  数学  物理  生物
小明  90  92  98  94
小红  98  87  95  92
小刚  87  90  80  88

小明,小红,小刚是两个DataFrame中共同的行标签,当join等于inner时,只有他们三个人的数据会保留下来。

4. ignore_index

将ignore_index设置为True, 使用concat连接后,原有的索引将被丢弃,结果使用整数索引

import pandas as pd

data1 = {
    '语文': [90, 98, 87, 90],
    '数学': [92, 87, 90, 98]
}

df1 = pd.DataFrame(data1, index=['小明', '小红', '小刚', '小丽'])

data2 = {
    '语文': [98, 95, 80, 98],
    '数学': [94, 92, 88, 94]
}

df2 = pd.DataFrame(data2, index=['小林', '小李', '小张', '小王'])

df = pd.concat([df1, df2], ignore_index=True)
print(df)

程序输出结果

   语文  数学
0  90  92
1  98  87
2  87  90
3  90  98
4  98  94
5  95  92
6  80  88
7  98  94

5. keys

将多份数据合并后,如果还想标识一个数据的来源, 可以使用keys参数

import pandas as pd

data1 = {
    '语文': [90, 98, 87, 90],
    '数学': [92, 87, 90, 98]
}

df1 = pd.DataFrame(data1, index=['小明', '小红', '小刚', '小丽'])

data2 = {
    '语文': [98, 95, 80, 98],
    '数学': [94, 92, 88, 94]
}

df2 = pd.DataFrame(data2, index=['小林', '小李', '小张', '小王'])

df = pd.concat([df1, df2], keys=['a', 'b'])
print(df)

程序输出结果

      语文  数学
a 小明  90  92
  小红  98  87
  小刚  87  90
  小丽  90  98
b 小林  98  94
  小李  95  92
  小张  80  88
  小王  98  94

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案