文章数据
收藏(次)
【python数据分析】第五章 pandas入门-2
重新索引:
obj = pd.Series([1,2,3])
obj2 = obj.reindex(index=[3,3,1,4])
obj2 输出:
3 NaN
3 NaN
1 2.0
4 NaN
dtype: float64
重新索引的新索引在 obj 中不存在,就补NaN, 存在就使用,多余的就不要了,而且按照顺序
--------------------------------------------------------------------------------
如果指定的索引原索引中不存在,那么values 就会补充 NaN, 那能不能补充一点其他的呢
这时需要做一些插值处理。method选项即可达到此目的,例如,使用ffill可以实现前向值填充
obj = pd.Series([1,2,3])
obj2 = obj.reindex(range(8), method='ffill')
obj2 输出:
0 1
1 2
2 3
3 3
4 3
5 3
6 3
7 3
dtype: int64
ffill 如果当前没有值,那么使用前值填充本数据,索引3没有值,使用前值填充......
--------------------------------------------------------------------------------
import numpy as np
frame = pd.DataFrame(np.arange(9).reshape((3, 3)),index=['a', 'b', 'c'],
columns=['col1', 'col2', 'col3'])
frame
# 可以对行索引 还能对 列索引进行重新索引呢
frame.reindex(index=['d', 'c', 'b', 'a'], columns=['col3', 'col2', 'col1', 'col4'])
--------------------------------------------------------------------------------
reindex 方法的参数:
index: 新的索引
method 插值(填充)方式
fill_value 缺失值时的替代值
limit 向前或者向后填充的最大填充量
tolerance 向前后填充值时,填充不准确匹配项的最大间距
level 在 MultilIndex的指定级别上匹配简单索引,否则选取其子集
copy 默认 True, 无论如何都复制,False 新旧相同就不复制
--------------------------------------------------------------------------------
删除数据:
obj = pd.Series([1,2,3,4,5,6])
obj.drop(1)
obj.drop([1,2])
#obj.drop([1,2, 10]) Error 因为没有 10 这个索引
删除 指定索引的数据,返回一个新的不包含被删数据的数据, 原数据不会变化
================================================================================
frame = pd.DataFrame(np.arange(9).reshape((3, 3)),index=['a', 'b', 'c'],
columns=['col1', 'col2', 'col3'])
frame.drop(['b', 'c'], axis=0) # axis=0 不指定默认是0, 即从索引上找
frame.drop(['col1'], axis=1) # axis=1 在columns 上找删除的东西,
# frame.drop(['col1111'], axis=1) # columns 上没有 col1111 ,报错, 即删除一个不存在就报错
不指定 axis=0 或者 1,不好记,可以这样,就是麻烦
frame.drop(['b', 'c'], axis='index')
frame.drop(['col1'], axis='columns')
删除数据改变了原数据的结构,所以返回一个新的数据,而之前的数据并没有改变,
如果想要在原数据上改,不是返回新的,可以重新赋值(不推荐),也可以这样:
frame.drop(['col1'], axis='columns', inplace=True) # 谨慎使用,会破坏原数据
--------------------------------------------------------------------------------
obj = pd.Series([1,2,3,4,5], index=[5,4,3,2,1])
obj2 = pd.Series([1,2,3,4,5], index=['a', 'b', 'c', 'd', 'e'])
索引是数字类型,那么 obj[1] obj[[1,2]] obj[1:2] 就是按照索引查找
索引不是数字类型的。obj2[2] obj2[[1,2]] obj2[1:3] 数值是位置。 还能按索引: obj2[['a', 'd']]
这样的切片: obj2['a': 'd'] 输出:(注意是前后都包含的)
a 1
b 2
c 3
d 4
dtype: int64
按值索引:下面两个都是输出 值满足条件的数据
obj[obj>3]
obj2[obj2>3]
--------------------------------------------------------------------------------
frame = pd.DataFrame(np.arange(9).reshape((3, 3)),index=['r1', 'r2', 'r3'],
columns=['c1', 'c2', 'c3'])
frame['r1'] # ERROR 不能对行这样索引, 只能像下面那样对列获取
frame['c1']
frame[['c1', 'c2']]
但是对行的切片是可以的:
frame['r1':'r2'] # 对行索引,前闭 后也闭
frame[1:2] # 对行的切片,因为索引现在不是数值,所以是位置切片, 前闭后开的
对内容索引:
frame[frame['c1'] > 3]
修改内容:
frame = pd.DataFrame(np.arange(9).reshape((3, 3)),index=['r1', 'r2', 'r3'],
columns=['c1', 'c2', 'c3'])
frame> 4 输出:
c1 c2 c3
r1 False False False
r2 False False True
r3 True True True
frame[frame > 4] = 99
frame 输出:
c1 c2 c3
r1 0 1 2
r2 3 4 99
r3 99 99 99
--------------------------------------------------------------------------------
对于DataFrame的行的标签索引,引入了特殊的标签运算符loc和iloc
使用轴标签(loc)或整数索引(iloc)
frame.loc['r1', ['c1', 'c3']]
frame.loc[['r1', 'r2'], ['c1', 'c3']]
# 前面两个是 index 的位置索引, 后面是 columns 的位置索引
frame.iloc[[0,2], [1, 2]]
使用切片:
frame.loc['c1':'c2'] # 返回了 空,因为没有选择行
frame.loc[:, 'c1':'c2'] # 所有行的指定列
frame.loc['r1':'r2', 'c1':'c2'] # 指定行的指定列
frame.loc['r1':] # 不指定列,就是全部列
frame.loc['r1':'r2', 'c1':'c2'][frame.c3 > 2] # 内容再次检索,会有警告,因为数据可能不同型了
--------------------------------------------------------------------------------
DateFrame df 的方法
df[x]
df.loc
df.iloc
df.at
df.iat
df.reindex
df.get_value
df.set_value
================================================================================
算术运算和数据对齐
--------------------------------------------------------------------------------
Series 相加, index 相同的会相加,取并集, 一个 series 有某个index, 另一个没有,
取并集,时相加 就是一个数据和 NAN 相加,结果是 NAN
s1 = pd.Series([1,2,3], index=('a', 'b', 'c'))
s2 = pd.Series([1,2,3], index=( 'b', 'c', 'd'))
s1 + s2 输出:
a NaN
b 3.0
c 5.0
d NaN
dtype: float64
但是相减为什么是这样呢?相减也是索引取并集,相同索引的相减,数组和 NA运算得到NA
s1 - s2 输出:个人理解是 s1 的index 保留,s2 不在s1中的索引不应该出现,但不是这样的。 为什么这样
a NaN
b 1.0
c 1.0
d NaN
dtype: float64
--------------------------------------------------------------------------------
DataFrame 相加时 index 和 column 都是这样的处理
--------------------------------------------------------------------------------
df1 = pd.DataFrame(np.arange(12.).reshape((3, 4)),columns=list('abcd'))
df2 = pd.DataFrame(np.arange(20.).reshape((4, 5)),columns=list('abcde'))
df2.loc[1,'b'] = np.nan
df1 + df2 输出:
a b c d e
0 0.0 2.0 4.0 6.0 NaN
1 9.0 NaN 13.0 15.0 NaN
2 18.0 20.0 22.0 24.0 NaN
3 NaN NaN NaN NaN NaN
只要没有对的上的数就是 NAN, 和 NAN 运输的还是 NAN
这时可以指定如果没有对应上的,不再是 NAN, 而是指定默认值,让存在和数据和默认值计算
df2.add(df1, fill_value=0) # 连我们故意设置成 NAN 的也有默认值计算
输出:
a b c d e
0 0.0 2.0 4.0 6.0 4.0
1 9.0 5.0 13.0 15.0 9.0
2 18.0 20.0 22.0 24.0 14.0
3 15.0 16.0 17.0 18.0 19.0
--------------------------------------------------------------------------------
这样的方法还有:r 表示反转, a.add(b) => a+b 相当于 b.radd(a) => a + b
add radd
sub rsub
div rdiv
floordiv rfloordiv 除法,得到整数
mul rmul 乘法
pow rpow 指数 x**y
--------------------------------------------------------------------------------
df1.reindex(columns=df2.columns, fill_value=0)
输出:
a b c d e
0 0.0 1.0 2.0 3.0 0
1 4.0 5.0 6.0 7.0 0
2 8.0 9.0 10.0 11.0 0
--------------------------------------------------------------------------------
分享
收藏
点赞人
举报
文章标签
评论列表