定义
Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据)
- Series 是一种类似于一维数组的对象,它由一组数据(各种 Numpy 数据类型)以及一组与之相关的数据标签(即索引)组成。
- DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
注意点
- 读取excel或者csv都会将列表变成str
- excel的列对于很长的内容可能会截断,而csv不会
- 输出excel或者csv的时候,最好将int转化成str
具体用法
# 从 CSV 文件中读取数据并生成 DataFrame
df = pd.read_csv('file_path.csv')
# 将 DataFrame 写入 CSV 文件
df.to_csv('output.csv', index=False)
# 从 直接读取文件中的多个 sheet 并转换为字典,每个 sheet 的内容是一个 DataFrame
df = pd.read_excel('file_path.xlsx', sheet_name=['sheet_name'])
# 将 DataFrame 写入 Excel 文件
df.to_excel('output.xlsx', index=False)
# 按行返回 (index, Series) 对
for idx, row in df.iterrows():
print(idx, row)
# 按行返回一个 namedtuple,每行的字段可通过属性访问
for row in df.itertuples():
print(row.Index, row.name, row.score)
# 返回的是 test_data 数据框中 pic_url 列的值作为 NumPy 数组
test_data['pic_url'].values
# 使用 drop() 方法删除列,inplace=True代表原地操作,不返回新的数据框
facility.drop(columns=['review_body', 'relation_score'], inplace=True)
# 重新组合需要的列
merged = merged[['mt_poi_id', 'poi_name', 'highlight_id', 'main_title', 'sub_title', 'type_id', 'type_name', 'text']]
# 按位置(整数下标)来选取数据
- df.iloc[0, 0] # 选取第0行,第0列
- df.iloc[:3, :] # 选取前3行,所有列
- df.iloc[0:3, 1:4] # 选取第0行到第2行,第1列到第3列
# 非常重要的标签(label)选择器,基于“行标签”和“列标签”进行数据的精确选取、赋值和切片。
- df.loc['row_label', 'column_label'] # 选取具有特定标签的行和列
- df.loc['row_label_start':'row_label_end', :] # 选取某个标签范围的行和所有列
- df.loc['row_label_start':'row_label_end', 'column_label_start':'column_label_end'] # 选取特定标签范围的行和特定标签范围的列
- df.loc[df['A'] > 0, 'B'] = 100 # 按条件批量赋值
- df.loc[df['A'] > 0, ['B', 'C']] = [1, 2] # 多列赋值
# 将 Series 或 DataFrame 的数据从一种类型转换为另一种类型
- df['poi_id'].astype(str)
# 统计 Series 中每个唯一值出现次数的方法。
- data_raw['platform_name'].value_counts()
# 查看数据
- df.head(5) # 返回 DataFrame 的前 n 行
- df.tail(5) # 返回 DataFrame 的后 n 行
# 返回 DataFrame 列名
- df.columns
# 将函数 func 应用于 DataFrame 的行或列
# 默认axis=0应用于每列,axis=1应用于每行,适合多列的数据的操作
- data[['highlight_new', 'content_body_new'] = data.apply(lambda row: my_cal_sim(row['highlight'], row['content_body']), axis=1, result_type='expand')
- data['pics'] = data['pics'].apply(get_pic_top3)
- progress_apply() # 显示处理进度的apply
# 将 DataFrame 按指定列分组,并可进行聚合操作,如果值为NaN则不会参与分组
- facility = facility.groupby(['mt_poi_id', 'poi_name'])['content_body'].apply(list).reset_index() # apply(list) 适用于单列
- highlight = highlight.groupby(['mt_poi_id', 'poi_name'])[['highlight', 'highlight_pic']].agg(list).reset_index() # agg(list) 适用于多列
- template_pic = (
highlight_recall_pics20.groupby(['mt_poi_id', 'poi_name', 'highlight']) # 根据三个字段进行分组
.apply(
lambda group: group.sort_values('score', ascending=False) # 组内按 score 降序排序
.head(20) # 取前20条
[['pic_url', 'score']] # 保留目标列
.to_dict('records') # 转为字典列表:[{'pic_url': 'text', 'score': 101}, ...]
)
.reset_index(name='pics') # 重置索引并命名结果列
)
# merge两个 DataFrame
- merged_df = pd.merge(df1, df2, on='mt_poi_id', how='inner')
- merged_df = pd.merge(df1, df2, left_on='mt_poi_id', right_on='poi_id', how='inner')
# 根据指定列对 DataFrame 排序
- sorted_df = df.sort_values('col', ascending=False)
- sorted_df = df.sort_values(['col1', 'col2'], ascending=[False, True])
# 删除数据框中的重复行
## keep='first':保留第一次出现的重复行,删除后续相同的行。keep=False:删除所有相同的行。
## subset=None:如果没有指定具体的列名称,将基于整个数据框来判断重复。
- data = data.drop_duplicates(subset = ['main_poi_id', 'review_id'])
# 沿着行进行连接,默认axis=0
- concated = pd.concat([df1, df2], axis=0)
# 以 mt_poi_id 分组,取每组 poi_name 的第一个值,生成一个字典(key为mt_poi_id,value为poi_name)。
- id2name = data_raw.groupby('mt_poi_id')['poi_name'].agg('first').to_dict()
# 把 mt_poi_id 这一列的每个值映射为对应的 poi_name,并赋值给 data_raw['poi_name']。这样可以确保同一个 mt_poi_id 的 poi_name 保持一致。
- data_raw['poi_name'] = data_raw['mt_poi_id'].map(id2name)
# reset_index()的作用是将索引(index)还原为普通列,并生成新的默认整数索引
- s1 = df.groupby(['city', 'type'])['score'].mean()
- s2 = df.groupby(['city', 'type'])['score'].mean().reset_index()
- s3 = df.groupby(['city', 'type'])['score'].mean().reset_index(name='score_mean')
# 缺失值处理
- df[['col1', 'col2', 'col3']] = df[['col1', 'col2', 'col3']].fillna(0) # 一次性对多列统一填充值
- df.fillna({'col1': 0, 'col2': '未知', 'col3': -1}, inplace=True) # 对不同字段填充不同的值
- df['col1'] = df['col1'].fillna(0) # 只对部分字段填充
- data = data.where(pd.notnull(data), None) # 将缺失值置为None,在hive表中为NULL