Skip to content

Pandas

DataFrame对象基本操作

Dataframepandas的核心数据结构,他是一个表格型数据结构,类似于Excel表格。

python
import pandas as pd
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35],
        'City': ['New York', 'Paris', 'London']})
  • 查看数据

    python
    df.head(num)  # 查看前num行数据
    df.tail(num)  # 查看后num行数据
    df.shape  # 查看DataFrame的形状,返回一个元组 (行数, 列数)
    df.info()  # 查看DataFrame的基本信息,包括数据类型、非空值数量
    df.describe()  # 查看DataFrame的统计信息,包括计数、均值、标准差、最小值、最大值等
    df.columns  # 获取DataFrame的列名
  • 选择数据

    python
    df['new_column'] = value  # 添加新列
    df['Age'] # 选择单列
    df[['Name', 'Age']] # 选择多列
    df.loc['Age']  # 使用列明选择数据
    df.iloc[0] # 使用位置索引选择数据
    df[df['Age'] > 30]  # 使用条件选择数据
  • 修改数据

    python
    df['New_Column'] = values # 添加新列
    df.drop('Column',axis=1)  # 删除列
    df.rename(columns={'Old_Name': 'New_Name'})  # 重命名列
  • 数据处理

    python
    df.sort_values(by='Age')  # 按照某列排序
    df.groupby('City').mean()  # 分组聚合
    df.isnull()  # 检查缺失值
    df.fillna(value)  # 填充缺失值

创建DataFrame

pd.DataFrame() 是 Pandas 中用于创建 DataFrame 的核心构造函数,下面详细介绍其参数和使用方法。

  • 函数签名

    python
    import pandas as pd
    pd.DataFrame(data=None, 
                 index=None, 
                 columns=None, 
                 dtype=None, 
                 copy=False)
  • 参数说明

    • data:可以是多种类型的数据结构,如列表、字典、NumPy数组等。
    • index:可选参数,用于指定行索引。默认会自动生成整数索引。
    • columns:可选参数,用于指定列名。默认使用整数索引作为列名。
    • dtype:可选参数,用于指定 DataFrame 中数据的类型。默认根据数据自动推断类型。
    • copy:布尔值,默认为 False。如果为 True,则会复制数据,而不是引用原始数据。
  • 示例

    python
    import pandas as pd
    
    # 指定索引和列名
    df = pd.DataFrame(
      data={'成绩': [90, 85, 78]},
      index=['张三', '李四', '王五'],
      columns=['成绩']
    )
    
    # 指定数据类型
    df = pd.DataFrame(
      data={
          'A': pd.Series([1, 2, 3]),
          'B': pd.Categorical(['a', 'b', 'a']),
          'C': ['x', 'y', 'z']
      },
      dtype={'A': 'float32', 'C': 'category'}
    )

DataFrame索引(切片)

DataFrame的索引有列索引和行索引两种,均支持切片操作。

  • 列索引

    python
    df['column_name']  # 选择单列
    df[['col1', 'col2']]  # 选择多列
  • 行索引

    python
    df.loc['index_name']  # 使用行标签选择单行
    df.loc[['index1', 'index2']]  # 使用行标签选择多行
    df.iloc[0]  # 使用行下标选择第一行
    df.iloc[1:3]  # 使用行下标选择第二行到第三行(不包括第四行)
    df[df['column_name'] > value]  # 使用条件选择行
  • 混合索引 使用:进行切片,使用,进行混合筛选

    python
    df.loc['index_name', 'column_name']  # 选择特定行和列
    df.iloc[0:2, 1:3]  # 选择前两列和第二到第三行位置的数据

分组聚合

在pandas中,groupby()操作返回一个GroupBy对象,可以对数据进行分组聚合操作。常用的聚合函数包括mean()sum()count()等。

  • 函数签名
python
DataFrame.groupby(by=None,
                  axis=0, 
                  level=None, 
                  as_index=True, 
                  sort=True, 
                  group_keys=True, 
                  squeeze=False, 
                  observed=False, 
                  dropna=True)
  • 参数类型

    • by:用于指定分组的列,可以是列名、列名列表、与DataFrame长度相同的数组或Series或函数。
    • axis:用于指定分组的轴,默认为0(按行分组)。
    • level:用于指定分组的层级,仅在多级索引时使用。
    • as_index:True -> 分组列将成为groupby对象的索引
    • sort:用于指定是否对分组结果进行排序,默认为True。
    • group_keys:当调用apple时,是否将分组键添加到索引以识别片段
    • squeeze:如果结果是单列或单行,是否将其转换为Series。
    • observed:仅在分组变量是Categorical(分类类型)时使用,默认为False,表示包括所有类别;如果为True,则仅包括在数据中出现的类别。
    • dropna:用于指定是否在分组时抛弃NA值,默认为True。
  • 基本统计方法

    • mean():计算均值
    • sum():计算总和
    • count():计算非空值数量
    • min():计算最小值
    • idxmin():计算最小值的索引
    • max():计算最大值
    • idxmax():计算最大值的索引
    • std():计算标准差
    • var():计算方差
  • 其他聚合方法

    • agg():可以对不同列应用不同的聚合函数

      python
      import pandas as pd
      df = pd.DataFrame({
          'A': ['foo', 'bar', 'foo', 'bar'],
          'B': [1, 2, 3, 4],
          'C': [5, 6, 7, 8]
      })
      df.groupby('A').agg({'B': 'sum', 'C': 'mean'})
      df.groupby('A').agg(['mean', 'sum', 'count'])
    • apply(func):可以对分组后的数据应用自定义函数

      python
      df.groupby('A').apply(lambda x: x['B'].sum())
    • transform(func):对分组后的数据进行转换,返回与原数据相同形状的结果

      python
      df.groupby('key')['value'].transform(lambda x: x - x.mean())
  • 使用示例

python
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': np.random.randn(8),
    'D': np.random.randn(8)
})

# 基本分组
grouped = df.groupby('A')

# 多列分组
multi_grouped = df.groupby(['A', 'B'])

# 使用函数分组
func_grouped = df.groupby(lambda x: x % 2)  # 按索引奇偶分组

# 分组后不将分组列作为索引
not_indexed = df.groupby('A', as_index=False).mean()

# 不排序分组键
unsorted = df.groupby('A', sort=False).sum()

# 处理分类数据和NA值
df_with_cats = df.copy()
df_with_cats['A'] = pd.Categorical(df['A'], categories=['foo', 'bar', 'baz'])
df_with_cats.loc[3, 'A'] = np.nan

cat_grouped = df_with_cats.groupby('A', observed=True, dropna=False).count()

数据透视表

数据透视表是用于对数据进行汇总、分析和可视化的强大工具。在pandas中,可以使用pivot_table()函数创建数据透视表。

  • 函数签名
python
DataFrame.pivot_table(values=None,
                      index=None,
                      columns=None,
                      aggfunc='mean',
                      fill_value=None,
                      margins=False,
                      dropna=True)
  • 参数说明

    • values:用于指定要汇总的列。
    • index:用于指定行索引。
    • columns:用于指定列索引。
    • aggfunc:用于指定汇总函数,默认为mean
    • fill_value:用于指定缺失值填充的值。
    • margins:布尔值,默认为False,表示是否添加边际统计。
    • dropna:布尔值,默认为True,表示是否丢弃缺失值。
  • 示例

python
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar'],
    'B': ['one', 'one', 'two', 'two'],
    'C': np.random.randn(4),
    'D': np.random.randn(4)
})

# 创建数据透视表
pivot = df.pivot_table(values='C', index='A', columns='B', aggfunc='mean')

字符串操作

在pandas中,可以使用字符串方法对Series中的字符串数据进行操作。常用的字符串方法包括str.lower()str.upper()str.contains()等。

  • 示例
python
import pandas as pd

df = pd.DataFrame({
    'A': ['foo', 'bar', 'baz'],
    'B': ['one', 'two', 'three']
})

# 转换为小写
df['A'].str.lower()

# 转换为大写
df['B'].str.upper()

# 显示每个字符串的长度
df['B'].str.len()

# 去除空格
df['B'].str.strip()
df['B'].str.lstrip()  # 去除左空格
df['B'].str.rstrip()  # 去除右空格



# 检查是否包含子串
df['B_contains_e'] = df['B'].str.contains('e')

# 检查是否以特定子串开头
df['B_starts_with_t'] = df['B'].str.startswith('t')

# 检查是否以特定子串结尾
df['B_ends_with_e'] = df['B'].str.endswith('e')

时间序列操作

python
import pandas as pd
import datetime

dt = datetime.datetime(year=2017, month=11, day=24, hour=10, minute=30)
dt # datatime.datatime(2017, 11, 24, 10, 30)

ts = pd.Timestamp(dt)  # 转换为pandas的时间戳对象
ts # Timestamp('2017-11-24 10:30:00')

ts.month()  # 11
ts.day()  # 24
ts.hour()  # 10
ts.minute()  # 30


# pd的Timestamp对象可以直接进行时间运算
ts + pd.Timedelta('5 days')
ts # Timestamp('2017-11-29 10:30:00')

pd.to_datetime('2017-11-24 10:30:00')  # Timestamp('2017-11-24 10:30:00')


s = pd.Series(pd.date_range('2017-11-24', periods=5, freq='D'))
s
# 0   2017-11-24
# 1   2017-11-25
# 2   2017-11-26
# 3   2017-11-27
# 4   2017-11-28
# dtype: datetime64[ns]

Released under the MIT License.