pandas -- Dataframe 初步使用

发布时间 2024-01-06 00:56:14作者: miyou379

Dataframe 的读取

(1) 直接声明

## 先是一个字典的形式
data = {
    "keyname1": [ "elem1", "elem2" ],
    "keyname2": [ "elem3", "elem4" ]
    }
df = pd.DataFrame(data, index = [ <columns> ])  # 别忘了转换

## Output
  keyname1 keyname2
0    elem1    elem3
1    elem2    elem4

(2) 读取 Excel 或 csv

os.chdir("$dir")

## Excel
df = pd.read_excel("$filename", encoding = "utf-8" or "GBK")

## csv
df = pd.read_csv("$filename", encoding = "utf-8" or "GBK")

## 写入 Excel
df.to_excel("$Path", encoding = "utf-8", index = False)
# index 很重要!

## 写入 csv
df.to_csv("$Path", encoding = "utf-8", index = False)

(3) 访问基础属性

df.columns
# <class 'pandas.core.indexes.base.Index'> 实际上是列表

df.index
# <class 'pandas.core.indexes.range.RangeIndex'>

数据的选择

(1) 使用中括号

## 注意选中多列时是以 列表 作为选择对象
df[['keyname1', 'keyname2']][左闭:右开] # 可以用步长
# <class 'pandas.core.frame.DataFrame'>

## 选中单列
df['keyname1']
# <class 'pandas.core.series.Series'>
# 单列没有 columns 这个参数

(2) iloc
修改具体单元格数据必备

## 范围左闭右开
iloc[<行范围>, <列范围>]
# <class 'pandas.core.frame.DataFrame'>

iloc[<行>, <列>]
# 单元格具体的属性

(3) loc[左闭:右闭]
这玩意完全按照 索引 来查找,不推荐

Dataframe 的复制

当你要修改 df 的数据时,使用 .copy() 方法
在这之前请先考虑使用 新建 col 是否能代替不必要的复制内存消耗

Dataframe 的条件选择和数据处理

注意: 只能使用 &| 运算符,不能用 andor
合法操作示例:df["keyname1"][3:4][df["keyname2"].isin(list1)]
df['first_five_Letter'] = df['Country (region)'].str.extract(r'(^w{5})') **注意要赋值**

运算符/方法 作用
& 条件复合,注意加小括号
| 条件复合,注意加小括号
== <value> 筛选出等于给定值的行
.isin(<list>) 筛选出在列表中的行,不用==True
数据处理 简单
+ 字符串的连接或者数字加
- 数字减
.isna()/isnull() 判断是否等于np.nan
.round(1) 四舍五入到十分位
.apply(<function>, args=<list>) 最灵活的一集
.count(axis=0) 统计个数
.mean() 这列的平均值
.max()/min() 最大最小值
数据处理 正则
.str 全部转换为,可以用切片
.count(<regex>) 匹配正则的个数,返回Series,可以再用 .sum() 加总
.replace(<regex>, <str>) 替换
.contains(<regex>) 返回布尔值
.findall(<regex>) 对每个都应用,返回的是Series,与的匹配部分
.extract(<regex>) 提取满足表达式的,返回Series,注意()提取组
.match(<regex>) 对每个字符串都匹配,并返回布尔值Series
.split(<regex>, expand = True) 同 py,但是拆分成列了

Dataframe 的行列名替换

(1) 临时替换

print(df.rename(columns = {
    "keyname1": "1",
    "keyname2": 2
}))

(2) 永久替换

df.columns = ["1", 2]
print(type(df.columns[1]))

## Output
<class 'int'> 该是什么是什么

对元素、行号进行排序,重排序

(1) 对行号直接给定索引

## 注意赋值
df = df.reindex([4, 3])

(2) 一键重排序索引

## 注意赋值
## drop 参数用于删除旧索引
df = df.reset_index(drop = True)

(3) 利用索引值排序

## 注意赋值
## 可以用于复原排乱了的值
df = df.sort_index(ascending = True)

(4) sort_values 排序元素

## 注意赋值
df = df.sort_values(by = ["keyname1", "keyname2", ascending = True], axis = 0)  # 排序行

df = df.sort_values(by = [1, 3], axis = 1)  # 排序列

Dataframe 的删除和拼接

(1) drop

## 直接删行
df = df.drop(1)
df = df.drop(index = [1, 2])
df = df.columns(columns = ["keyname1", "keyname2"])

(2) merge 横向拼接列和 join 按索引拼接

## 如果不要 how 就是内连接
df = pd.merge(df1, df2, left_on = "keyname1", right_on = "keyname2", how = "left")

## 等价于上面的左外连接
df1 = df1.join(df2)

(3) concat 按索引外拼接(默认)

## 无视索引进行拼接,比如 columns 相同时的追加
df = pd.concat([df1, df2], ignore_index = True, axis = 0)