Bootstrap

一文搞懂Datafram【附工作积累的常用片段】

1. 创建 DataFrame
1.1. 已知数据创建
import pandas as pd

# 创建一个示例 DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
1.2. 未知数据创建
import pandas as pd

# 创建一个空的 DataFrame,指定列名为 'question' 和 'answer'
df = pd.DataFrame(columns=['question', 'answer'])

# 准备要添加的数据行
new_row = pd.DataFrame([{
    'question': '你喜欢编程吗?',
    'answer': '是的,我非常喜欢编程!'
}],
    columns=df.columns)

# 使用 concat 方法将新行添加到 DataFrame,并设置索引从1开始
df = pd.concat([df, new_row], ignore_index=True)

# 设置索引从1开始
df.index += 1
2. 更新表格列名
2.1. 创建时指定列名

在创建 DataFrame 时,可以通过 columns 参数直接指定列名。

import pandas as pd

# 创建一个示例 DataFrame,并指定列名
data = {
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
}
df = pd.DataFrame(data, columns=['A', 'B', 'C'])

print("创建时指定列名的 DataFrame:")
print(df)
2.2. 2. 创建后修改列名
2.2.1. 使用 columns 属性

可以直接赋值给 columns 属性来修改列名。

# 创建一个示例 DataFrame
data = {
    0: [1, 2, 3],
    1: [4, 5, 6],
    2: [7, 8, 9]
}
df = pd.DataFrame(data)

print("原始 DataFrame:")
print(df)

# 修改列名
df.columns = ['A', 'B', 'C']

print("修改列名后的 DataFrame:")
print(df)
2.2.2. 使用 rename 方法

rename 方法可以用来重命名特定的列。

# 创建一个示例 DataFrame
data = {
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
}
df = pd.DataFrame(data)

print("原始 DataFrame:")
print(df)

# 重命名特定列
df = df.rename(columns={'A': 'Column1', 'B': 'Column2'})

print("重命名特定列后的 DataFrame:")
print(df)
2.2.3. 从文件读取时指定列名

如果你是从文件(如 CSV 文件)读取数据,可以在读取时指定列名。

import pandas as pd

# 读取 CSV 文件,并指定列名
df = pd.read_csv('data.csv', names=['A', 'B', 'C'], header=0)

print("从文件读取并指定列名的 DataFrame:")
print(df)
2.2.4. 从列表或元组创建列名

你也可以从列表或元组中创建列名。

# 创建一个示例 DataFrame
data = {
    0: [1, 2, 3],
    1: [4, 5, 6],
    2: [7, 8, 9]
}
df = pd.DataFrame(data)

print("原始 DataFrame:")
print(df)

# 从列表创建列名
column_names = ['A', 'B', 'C']
df.columns = column_names

print("从列表创建列名后的 DataFrame:")
print(df
3. 基本属性和统计信息
2.1. 查看 DataFrame 的基本信息:
df.info()
3.1. 查看 DataFrame 的描述性统计信息:
print(df.describe())
3.2. 获取 DataFrame 的形状:
print(df.shape)
3.3. 检查 DataFrame 是否为空:
print(df.empty)
4. 查询
4.1. 法一
import pandas as pd
 
# 创建一个DataFrame
data = {'Name': ['Tom', 'Nick', 'John'],
        'Age': [20, 21, 19]}
df = pd.DataFrame(data)
 
# 按行读取
for index, row in df.iterrows():
    print(row["Name"], row["Age"])
4.2. 法二
import pandas as pd
 
# 创建一个DataFrame
data = {'Name': ['Tom', 'Nick', 'John'],
        'Age': [20, 21, 19]}
df = pd.DataFrame(data)
 
# 按行读取
for row in df.itertuples():
    print(row.Index, row.Name, row.Age)
4.3. 法三
import pandas as pd
 
# 创建一个DataFrame
data = {'Name': ['Tom', 'Nick', 'John'],
        'Age': [20, 21, 19]}
df = pd.DataFrame(data)
 
# 按行读取
df.apply(lambda row: print(row["Name"], row["Age"]), axis=1)

5. 选择和过滤
5.1. 选择单列:
names = df['Name']
print(names)
5.2. 选择多列:
selected_columns = df[['Name', 'Age']]
print(selected_columns)
5.3. 按条件过滤行:
filtered_df = df[df['Age'] > 30]
print(filtered_df)

# 选择列A大于2且列B为'd'的行
filtered_df = df[(df['A'] > 2) & (df['B'] == 'd')]
 
# 选择列A大于2或列B为'd'的行
filtered_df = df[(df['A'] > 2) | (df['B'] == 'd')]
5.4. 使用 loc 和 iloc 选择行和列:
# 选择第2行(索引为1)
row_2 = df.loc[1]
print(row_2)

# 选择第2行和第3行,只选择'Name'和'Age'两列
rows_2_3 = df.loc[1:2, ['Name', 'Age']]
print(rows_2_3)

# 使用 iloc 选择第2行(索引为1)
row_2 = df.iloc[1]
print(row_2)

# 使用 iloc 选择第2行和第3行,只选择前两列
rows_2_3 = df.iloc[1:3, :2]
print(rows_2_3)
6. 添加和删除
6.1. 添加新列:
df['Salary'] = [50000, 60000, 70000, 80000]
print(df)
6.2. 删除列:
df = df.drop(columns=['Salary'])
print(df)
6.3. 添加新行:

注意:新版本的 pandas 支持 append 创建新行,推荐使用 concat 函数。

new_row = {'Name': 'Eva', 'Age': 28, 'City': 'San Francisco'}
df = df.append(new_row, ignore_index=True)

# 使用 concat 方法将新行添加到 DataFrame
df = pd.concat([df, new_row], ignore_index=True)

print(df)
6.4. 删除行:
df = df.drop(index=4)
print(df)
7. 修改
7.1. 修改单个值:
df.at[0, 'Age'] = 26
print(df)
7.2. 修改多行或多列:
df.loc[df['Age'] > 30, 'City'] = 'New City'
print(df)
7.3. 修改表头
# 将'A'列重命名为'X'
df.rename(columns={'A': 'X'}, inplace=True)

8. 排序
8.1. 按列排序:
sorted_df = df.sort_values(by='Age')
print(sorted_df)
8.2. 按多列排序:
sorted_df = df.sort_values(by=['Age', 'City'])
print(sorted_df)
9. 应用函数
9.1. 应用自定义函数:
def age_group(age):
    if age < 30:
        return 'Young'
    elif age < 40:
        return 'Middle-aged'
    else:
        return 'Old'

df['Age Group'] = df['Age'].apply(age_group)
print(df)
9.2. 使用 lambda 函数:
df['Age Group'] = df['Age'].apply(lambda x: 'Young' if x < 30 else ('Middle-aged' if x < 40 else 'Old'))
print(df)
10. 统计和聚合
10.1. 计算均值:
mean_age = df['Age'].mean()
print(mean_age)
10.2. 计算总和:
total_age = df['Age'].sum()
print(total_age)
10.3. 分组聚合:
grouped = df.groupby('City')['Age'].mean()
print(grouped)
11. 缺失值处理
11.1. 检查缺失值:
print(df.isnull())
11.2. 填充缺失值:
df['Age'].fillna(0, inplace=True)
print(df)
11.3. 删除缺失值:
df.dropna(inplace=True)
print(df)
12. 重塑和重组
12.1. 重置索引:
df = df.reset_index(drop=True)
print(df)
12.2. 透视表:
pivot_table = df.pivot_table(values='Age', index='City', aggfunc='mean')
print(pivot_table)
12.3. 熔化数据:
melted_df = df.melt(id_vars='Name', value_vars=['Age', 'City'], var_name='Variable', value_name='Value')
print(melted_df)
13. 合并和连接
13.1. 合并两个 DataFrame:
data2 = {
    'Name': ['Alice', 'Bob', 'Eva'],
    'Salary': [50000, 60000, 70000]
}
df2 = pd.DataFrame(data2)

merged_df = pd.merge(df, df2, on='Name', how='left')
print(merged_df)
13.2. 连接两个 DataFrame:
concatenated_df = pd.concat([df, df2], axis=1)
print(concatenated_df)
14. 保存数组
14.1. 保存为 CSV 文件
import pandas as pd

# 创建一个示例 DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data)

# 保存为 CSV 文件
df.to_csv('data.csv', index=False)  # index=False 不保存索引
14.2. 保存为 Excel 文件
# 保存为 Excel 文件
df.to_excel('data.xlsx', index=False)  # index=False 不保存索引
14.3. 保存为 JSON 文件
# 保存为 JSON 文件
df.to_json('data.json', orient='records', lines=True, force_ascii=False)  # orient='records' 保存为记录格式 force_ascii 中文显示中文
14.4. 保存为 HDF5 文件

需要安装: pip install tables

# 保存为 HDF5 文件
df.to_hdf('data.h5', key='df', mode='w')  # key 是数据集的名称
14.5. 保存为 Pickle 文件
# 保存为 Pickle 文件
df.to_pickle('data.pkl')
14.6. 保存为 SQLLite 数据库
import sqlite3

# 连接到 SQLite 数据库
conn = sqlite3.connect('data.db')

# 保存为 SQL 表
df.to_sql('table_name', con=conn, if_exists='replace', index=False)

# 关闭数据库连接
conn.close()
14.7. 保存为 Mysql
from sqlalchemy import create_engine

# 数据库连接信息
username = 'root'
password = 'BWOYO0R7oDt40y0shH6t'
host = '192.168.0.91'  # 例如 'localhost' 或者云服务的IP地址
port = '13306'  # MySQL默认端口
database = 'BuckyDrop'

# 创建数据库连接
engine = create_engine(
    f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}')


table_name = 'test'  # 指定要写入的表名

# 写入数据库
df.to_sql(name=table_name, con=engine, if_exists='replace', index=False)

# 读取数据以验证
result_df = pd.read_sql_query(f'SELECT * FROM {table_name}', engine)
print(result_df)

14.8. 保存为 Parquet 文件
# 保存为 Parquet 文件
df.to_parquet('data.parquet', engine='pyarrow')  # 可以使用 'pyarrow' 或 'fastparquet' 引擎
14.9. 保存为 Feather 文件
# 保存为 Feather 文件
df.to_feather('data.feather')
14.10. 保存为 HTML 文件
# 保存为 HTML 文件
df.to_html('data.html', index=False)  # index=False 不保存索引
14.11. 保存为 Markdown 文件

需要安装pip install tabulate

# 保存为 Markdown 文件
with open('data.md', 'w') as f:
    f.write(df.to_markdown(index=False))  # index=False 不保存索引
14.12. 示例代码

以下是一个综合示例,展示了上述多种保存方法:

import pandas as pd
import sqlite3

# 创建一个示例 DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data)

# 保存为 CSV 文件
df.to_csv('data.csv', index=False)

# 保存为 Excel 文件
df.to_excel('data.xlsx', index=False)

# 保存为 JSON 文件
df.to_json('data.json', orient='records', lines=True)

# 保存为 HDF5 文件
df.to_hdf('data.h5', key='df', mode='w')

# 保存为 Pickle 文件
df.to_pickle('data.pkl')

# 保存为 SQL 数据库
conn = sqlite3.connect('data.db')
df.to_sql('table_name', con=conn, if_exists='replace', index=False)
conn.close()

# 保存为 Parquet 文件
df.to_parquet('data.parquet', engine='pyarrow')

# 保存为 Feather 文件
df.to_feather('data.feather')

# 保存为 HTML 文件
df.to_html('data.html', index=False)

# 保存为 Markdown 文件
with open('data.md', 'w') as f:
    f.write(df.to_markdown(index=False))

这些方法可以帮助你将 DataFrame 保存为不同格式的文件,以便在不同的应用场景中使用。希望这些示例对你有帮助!


 

15. 示例代码

以下是一个综合示例,展示了上述多种操作:






import pandas as pd

# 创建一个示例 DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data)

# 查看基本信息
print("基本信息:")
print(df.info())

# 查看描述性统计信息
print("\n描述性统计信息:")
print(df.describe())

# 选择单列
names = df['Name']
print("\n选择单列:")
print(names)

# 按条件过滤行
filtered_df = df[df['Age'] > 30]
print("\n按条件过滤行:")
print(filtered_df)

# 使用 loc 选择行和列
row_2 = df.loc[1]
print("\n使用 loc 选择第2行:")
print(row_2)

rows_2_3 = df.loc[1:2, ['Name', 'Age']]
print("\n使用 loc 选择第2行和第3行,只选择'Name'和'Age'两列:")
print(rows_2_3)

# 添加新列
df['Salary'] = [50000, 60000, 70000, 80000]
print("\n添加新列:")
print(df)

# 删除列
df = df.drop(columns=['Salary'])
print("\n删除列:")
print(df)

# 添加新行
new_row = {'Name': 'Eva', 'Age': 28, 'City': 'San Francisco'}
df = df.append(new_row, ignore_index=True)
print("\n添加新行:")
print(df)

# 删除行
df = df.drop(index=4)
print("\n删除行:")
print(df)

# 修改单个值
df.at[0, 'Age'] = 26
print("\n修改单个值:")
print(df)

# 按列排序
sorted_df = df.sort_values(by='Age')
print("\n按列排序:")
print(sorted_df)

# 应用自定义函数
def age_group(age):
    if age < 30:
        return 'Young'
    elif age < 40:
        return 'Middle-aged'
    else:
        return 'Old'

df['Age Group'] = df['Age'].apply(age_group)
print("\n应用自定义函数:")
print(df)

# 分组聚合
grouped = df.groupby('City')['Age'].mean()
print("\n分组聚合:")
print(grouped)

# 检查缺失值
print("\n检查缺失值:")
print(df.isnull())

# 填充缺失值
df['Age'].fillna(0, inplace=True)
print("\n填充缺失值:")
print(df)

# 重置索引
df = df.reset_index(drop=True)
print("\n重置索引:")
print(df)

# 合并两个 DataFrame
data2 = {
    'Name': ['Alice', 'Bob', 'Eva'],
    'Salary': [50000, 60000, 70000]
}
df2 = pd.DataFrame(data2)

merged_df = pd.merge(df, df2, on='Name', how='left')
print("\n合并两个 DataFrame:")
print(merged_df)
;