Pandas使用小结
Ray Cheng 英砖生

创建Dataframe

在日常工作中,除了从文件中读取数据来创建DataFrame外,在需要将数据输出为特定表格格式时也会手动创建DataFrame。创建DataFrame的方法多种多样,但我个人偏好于通过列表的方式来创建它们:

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd

#创建单列df
data = [1, 2, 3, 4]
df_single = pd.DataFrame(data, columns=['Column_Name'])

#创建多列df
data = [[1, 2], [3, 4], [5, 6]]
df = pd.DataFrame(data, columns=['Column_1', 'Column_2'], index = ['row_1','row_2','row_3'])

#有时为了将索引名称作为第一列输出并重命名该列,可以这样做:
df = df.reset_index().rename(columns={'index': 'index_Labels'})

合并数据

在数据处理过程中,经常需要将不同的DataFrame进行拼接,这可以通过concat函数实现。常用的参数如下:

  • axis:接受0或1,表示连接的轴向为横向(x)或纵向(y),默认为0。
  • join:接受inner或outer。表示其他轴向上的索引是按交集(inner)还是并集(outer)进行合并。默认为outer。

横向拼接

当计算评测数据时,需要将数据按照不同模型拆分,并多次将评测数据与评测结果横向拼接以确保每个模型的评测结果都包含对应的评测数据。

image

特殊情况:如果两张表的索引完全相同,则无论使用’inner’还是’outer’,横向拼接后的行数都是相同的。

纵向拼接

在计算评测员方差时,会对每组评分进行拼接然后计算总的平均值。这同样涉及到拆分和拼接来构建合适的DataFrame。

image

特殊情况:如果两张表的列名完全一致,那么无论是’inner’还是’outer’,纵向拼接后的列数都是相同的。

这两种特殊情况本质上是因为join参数影响的是非连接轴的索引操作(即并集和交集)。因此,当纵向拼接且列名相同时,其结果自然是一致的;横向拼接同理可得。

主键合并

如果不仅仅需要简单的拼接,而是根据某一列匹配两个表的值,则需要用到merge函数。例如,在进行多语种实体检查时,可通过英文实体名来进行不同语言实体的翻译,所有参数都比较重要,如下:

image

重复值与空值处理

重复值

可以使用drop_duplicates函数对一列或多列的数据进行去重。主要参数包括:

  • subset: 接收string或者sequence,表示进行去重的列,默认None,表示全部列。也可以在针对列使用,就无需传入subset,如df['demo'].drop_duplicates()
  • keep:有三个参数,first - 保留第一个重复值,last - 保留第二个重复值,false - 只要是重复值,都不保留。
  • inplace:接收boolean,表示是否在原表上进行炒作,默认False。

空值

可以dropna或者fillna进行删除或填充,一般很少使用dropna因为会直接改变数据结构。更多是使用fillna进行填充,主要参数如下:

image

更多使用ffill,因为在处理数据时,往往某一个值,对应随后几行的好几个值。

向下拓展

explod函数非常有用,特别是在单元格内包含由逗号或换行符分隔的多个值时。比如,在处理实体泛化值时,就可以将泛化值通过逗号分隔成列表,然后向下扩展行,同时保持其他列的值不变。

1
2
3
4
5
6
7
df = pd.DataFrame({
'A': ['a', 'b', 'c'],
'B': [[1, 2], [3, 4, 5], [6]]
})

#两个参数,第一个参数为单个列名或者多列名列表,第二个参数ignore_index表示是否充值索引,默认为False
df_exploded = df.explode('B',ignore_index=False)

关于series的理解