Skip to main content

单表操作

我将不加详细解释的,给出代码

数据读取

指定列读取

使用 usecols参数可以在读取数据的时候,就指定读取的列

df = pd.read_csv('path_to_your_file.csv', usecols=columns_to_read)
df = pd.read_excel('path_to_your_file.xlsx', usecols=columns_to_read)

只读取列名

要在不加载整个数据集的情况下仅读取 CSV 文件的列名,可以设置 nrows 参数

nrows 就是设置需要读取的行,0 行就是列名了

df = pd.read_csv('path_to_your_file.csv', nrows=0)

column_names = df.columns.tolist()

数据修改

修改列名

df.rename(columns={'id': '编号'}, inplace=True)

修改列类型

将浮点数的列改成整数

df['score'] = df['score'].astype(int)

修改日期格式 int -> str

这个操作也比较常见,比如有一列的日期是数字格式的 20220101 (因为如果从 Excel 里面读取到 pandas 中就会这样)

现在希望修改成类似 2022-01-01,该怎么操作呢?

  1. 使用字符串操作 也就是将整数转换为字符串,并直接通过字符串切片添加分隔符:
df['date'] = df['date'].astype(str).str[:4] + '-' + df['date'].astype(str).str[4:6] + '-' + df['date'].astype(str).str[6:8]

当然,你要是想炫技,一行实现,也可以这样

df['date'] = df['date'].map(lambda x: str(x)[:4] + '-' + str(x)[4:6] + '-' + str(x)[6:8])
  1. 使用 pd.to_datetime()

将整数转换为日期类型,然后再格式化为所需的字符串格式。这种方法好处是可以处理实际日期的验证和格式化。

df['date'] = pd.to_datetime(df['date'].astype(str), format='%Y%m%d').dt.strftime('%Y-%m-%d')

修改日期格式 str -> int

这是上一个操作的镜像操作,怎么将一列字符串类型的日期(类似 2022-01-01),转换为数字?

df['date'].str.replace('-', '').astype(int)

修改顺序

根据 '序号' 列排序

df_sorted = df.sort_values(by='序号')

数据填充

使用某个固定值或根据其他数据计算得出的值来填充空值。

df.fillna(value=0, inplace=True)  # 例如,用0填充所有空值

对于连续数值数据,可以使用插值方法来估算空值。

df.interpolate(method='linear', inplace=True)  # 线性插值填充空值

数据删除

drop() 方法是最常用的删除列的方法。你可以指定要删除的列名和axis参数,例如删除B

df = df.drop('B', axis=1)

或者是删除包含空值的行

df.dropna(inplace=True) 

如果你想直接在原始 DataFrame 上操作,可以使用 Python 的 del 关键字。

del df['B']

此外,pop()方法除了删除列外,还可以返回被删除的列,这在需要使用被删除的数据时非常方便。

removed_column = df.pop('B')

修改索引

如果想将某一列添加到索引,可以使用如下代码

df = df.set_index('dt', append=True)

添加完之后如果需要删除,可以使用如下代码

df = df.reset_index('dt', drop=False)

也可以使用如下代码重置索引

df_sorted.reset_index(drop=True, inplace=True)

数据抽取

提取满足要求的列

提取前 100 列

df_subset = df.iloc[:, :100]

提取前 100 列和最后一列

column_indices = list(range(100)) + [-1]  # 生成一个包含前 100 列和最后一列索引的列表
df_subset = df.iloc[:, column_indices]

提取指定列名的列,例如提取所有列名以 'd' 开头的列

df_d_columns = df[[col for col in df.columns if col.startswith('d')]]

提取满足条件的行

筛选出 df 中列 a 的所有值存在于列表 b 中的行

df[df['a'].isin(b)]

比较常用的一个场景是筛选出 data 中某一列包含空值的行

data[data['y'].isna()]

镜像操作是筛选不是空值的行

df[df['y'].notnull()]

数据校验

比较两列

比较两列是否完全一致,注意下面的两列是可以来自不同的dataframe

df['a'].equals(df['b'])

检查空值

检查某一列,是否包含任何空值

df['column_name'].isnull().any() 

检查某一列是否全为空值

df['column_name'].isnull().all()

检查整个 dataframe 是否包含任何空值

df.isnull().any().any() 

输出整个 dataframe 包含任何空值的列的列名

df.columns[df.isnull().any()]

输出整个 dataframe 全是空值的列

df.columns[df.isnull().all()]

检查数据类型

查看数据类型和内存使用情况

print(df.info(memory_usage='deep'))