大家好,我是Mr数据杨。今天我将带领各位走进Python的奇妙世界,就像步入三国演义那样热闹且复杂的战争年代。这里,数据就像那些智勇双全的武将和策士,我们要学习如何访问和修改它们,就如同诸葛亮那样掌控战局。
先来理解一下如何使用访问器获取和设置数据。这就好比郭嘉在典韦死后得知曹操对他的感激和痛惜的心情,然后再妥善安排后续事务。在Python中也能通过访问器获取数据的信息,再对其进行修改。
接下来将学习DataFrame的列操作,包括选取列、列间数据运算和过滤列。就像周瑜用火攻击策略可以选取数据,进行运算和过滤,从而达到想要的结果。
再来是行数据的插入和删除,这好比战场上将士的阵亡和新兵的加入。还会学习如何在DataFrame中插入和删除列数据,这就如同在三国演义中,新的谋士如司马懿的加入和老将如张辽的离去。
最后还将探讨列数据的赋值和分配。当刘备得到荆州,却又需要交出荆州时,他就在进行数据赋值和分配,Python也可以这样操作数据。
今天的教程就像一场三国演义般的大战,让我们用智慧和勇气一同开启Python的学习之旅!
文章目录
- 访问和修改数据
- 使用访问器获取数据
- 使用访问器设置数据
- DataFrame 列操作
- 列的选取
- 列间的数据运算
- 列的条件判断过滤
- 行数据插入和删除
- 列数据插入和删除
- 列数据赋值
- 列分配
访问和修改数据
使用访问器获取数据
除了使用 .loc[]
访问器通过索引获取行或列的数据之外,Pandas还提供了 .iloc[]
访问器,它通过整数索引来检索行或列。
示例代码:
df.loc[10]
输出结果:
名前 阿会喃
字 -
读み -
性别 男
生年 190
登场 217
没年 225
...
酒\n興味 あり
物欲 强欲
Name: 10, dtype: object
df.iloc[0]
输出结果:
名前 阿会喃
字 -
读み -
性别 男
生年 190
登场 217
没年 225
...
酒\n興味 あり
物欲 强欲
Name: 10, dtype: object
.loc[]
和 .iloc[]
支持切片和类似NumPy的索引操作。
示例代码:
df.loc[:, '名前']
输出结果:
10 阿会喃
11 韋昭
12 伊籍
13 尹賞
14 尹大目
Name: 名前, dtype: object
df.iloc[:, 1]
输出结果:
10 阿会喃
11 韋昭
12 伊籍
13 尹賞
14 尹大目
Name: 名前, dtype: object
可以使用切片、列表或数组来获取多行或多列的数据。
示例代码:
df.loc[11:15, ['名前', '字']]
输出结果:
名前 字
11 韋昭 弘嗣
12 伊籍 機伯
13 尹賞 -
14 尹大目 -
df.iloc[1:6, [0, 1]]
输出结果:
名前 字
11 韋昭 弘嗣
12 伊籍 機伯
13 尹賞 -
14 尹大目 -
.iloc[]
可以使用与切片元组、列表和NumPy数组相同的方式跳过行和列。
示例代码:
df.iloc[1:6:2, 0]
输出结果:
11 韋昭
13 尹賞
Name: 名前, dtype: object
还可以使用Python内置的 slice()
类、numpy.s_[]
或者 pd.IndexSlice[]
。
示例代码:
df.iloc[slice(1, 6, 2), 0]
输出结果:
11 韋昭
13 尹賞
Name: 名前, dtype: object
df.iloc[np.s_[1:6:2], 0]
输出结果:
11 韋昭
13 尹賞
Name: 名前, dtype: object
df.iloc[pd.IndexSlice[1:6:2], 0]
输出结果:
11 韋昭
13 尹賞
Name: 名前, dtype: object
使用 .loc[]
和 .iloc[]
获取特定的数据值。但是当只需要单个值时,建议使用专门的访问器 .at[]
和 .iat[]
。
示例代码:
df.at[12, '名前']
输出结果:
'伊籍'
df.iat[2, 0]
输出结果:
'伊籍'
使用访问器设置数据
可以使用访问器来修改数据,可以传递Python序列、NumPy数组或单个值来修改数据。
示例代码:
df.loc[:13, '生年'] = [40, 50, 60, 70]
df.loc[14:, '生年'] = 0df['生年']
输出结果:
10 40
11 50
12 60
13 70
14 0
Name: 生年, dtype: int64
可以使用负索引 .iloc[]
来访问或修改数据。
示例代码:
df.iloc[:, -10] = np.array([88.0, 79.0, 81.0, 80.0, 68.0, 61.0, 84.0])
df['生年']
输出结果:
10 88.0
11 79.0
12 81.0
13 80.0
14 68.0
Name: 生年, dtype: float64
DataFrame 列操作
列的选取
设置和删除列的工作原理与类似的dict操作相同。
dfone two
a 1.0 1.0
b 2.0 2.0
c 3.0 3.0
d NaN 4.0df['one']
a 1.0
b 2.0
c 3.0
d NaN
Name: one, dtype: float64
列间的数据运算
df['three'] = df['one'] * df['two']
dfone two three
a 1.0 1.0 1.0
b 2.0 2.0 4.0
c 3.0 3.0 9.0
d NaN 4.0 NaN
列的条件判断过滤
df['flag'] = df['one'] >= 2
dfone two three flag
a 1.0 1.0 1.0 False
b 2.0 2.0 4.0 True
c 3.0 3.0 9.0 True
d NaN 4.0 NaN False
行数据插入和删除
创建要插入的新数据。
new = pd.Series(data=['Mr数据杨', 'xxx', "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"], index=df.columns)new
输出结果:
名前 Mr数据杨
字 xxx
读み -
性别 -
生年 -
登场 -
没年 -
...
酒\n興味 -
物欲 -
dtype: object
使用 df.append()
将新数据加入DataFrame。
df = df.append(pd.DataFrame(new).T)
df
输出结果:
使用 df.drop()
删除新数据。
df = df.drop(labels=[17])
df
输出结果:
列数据插入和删除
可以直接赋值来定义新列的名称和数据。
示例代码:
df['temp_data'] = np.array([71.0, 95.0, 88.0, 79.0, 91.0])
df
输出结果:
可以将新列的所有值设置为0。
示例代码:
df['temp_data'] = 0.0
df
输出结果:
使用 .insert()
在指定位置插入列数据。
示例代码:
df.insert(loc=4, column='new_temp_data', value=np.array([86.0, 81.0, 78.0, 88.0, 74.0, 70.0, 81.0]))
df
输出结果:
使用 del
关键字删除一列或多列。
示例代码:
del df['new_temp_data']
df
输出结果:
使用 df.drop()
删除列。
示例代码:
df = df.drop(labels='age', axis=1)
df
输出结果:
列数据赋值
赋值标量自动在列里广播填充。
df['foo'] = 'bar'
dfone flag foo
a 1.0 False bar
b 2.0 True bar
c 3.0 True bar
d NaN False bar
数据不完整按照索引对齐。
df['one_trunc'] = df['one'][:2]
dfone flag foo one_trunc
a 1.0 False bar 1.0
b 2.0 True bar 2.0
c 3.0 True bar NaN
d NaN False bar NaN
列分配
df_sample = pd.DataFrame({'A': range(1, 11), 'B': np.random.randn(10)})
df_sampleA B
0 1 -0.266848
1 2 -1.509007
2 3 0.247194
3 4 -0.002303
4 5 0.231006
5 6 0.395786
6 7 0.379266
7 8 0.181075
8 9 0.863928
9 10 0.636367df_sample.assign(ln_A = lambda x: np.log(x.A), abs_B = lambda x: np.abs(x.B))A B ln_A abs_B
0 1 -0.019896 0.000000 0.019896
1 2 0.924284 0.693147 0.924284
2 3 0.417785 1.098612 0.417785
3 4 -0.704264 1.386294 0.704264
4 5 0.829196 1.609438 0.829196
5 6 1.099349 1.791759 1.099349
6 7 1.223031 1.945910 1.223031
7 8 0.110445 2.079442 0.110445
8 9 1.257570 2.197225 1.257570
9 10 0.256807 2.302585 0.256807