'''创建多级索引'''
# 隐式创建
df1 = pd.DataFrame(np.random.randint(70, 100, size=(2, 4)),
index=['girl', 'boy'],
columns=[['English', 'English', 'Chinese', 'Chinese'], ['like', 'dislike', 'like', 'dislike']])
print(df1)
# 显示创建 pd.MultiIndex.from_product()
df2 = pd.DataFrame(np.random.randint(70, 120, size=(4, 2)),
columns=['girl', 'boy'],
index=pd.MultiIndex.from_product([['English', 'Chinese'], ['like', 'dislike']]))
print(df2)
# 检索多层索引
# 隐式
s = pd.Series(np.random.randint(0, 100, size=6),
index=[['a', 'a', 'b', 'b', 'c', 'c'], ['期中', '期末', '期中', '期末', '期中', '期末']])
print(s)
print(s['a'])
print(s[['a', 'b']])
# 取具体的值
print(s['a', '期中'])
print(s.loc['a'])
print(s.iloc[0])
print(s[0])
# 显式方式创建来检索
class1 = ['a', 'b', 'c']
class2 = ['期中', '期末']
s2 = pd.DataFrame(np.random.randint(0, 100, size=(6, 2)), index=pd.MultiIndex.from_product([class1, class2]))
print(s2)
print(s2[0]) # 单个检索默认是列
print(s2.loc['a'])
# iloc位置索引!!!!!
# loc标签索引
print(s2.loc['a','期中'])
print(s2.loc['a','期中'][0])
print(s2.iloc[1]) # 取到了行
print(s2.iloc[1,0])
# 更改索引的层级
df = pd.DataFrame(np.random.randint(70,100,size=(6,4)),
index=pd.MultiIndex.from_product([[1,2,3],['girl','boy']]),
columns=pd.MultiIndex.from_product([['English','Chinese'],['Y','N']]))
print(df)
df.index.names=['Class','Sex']
df.columns.names = ['Language','Pass']
print(df)
'''算术运算和数据对齐'''
# s1 = pd.Series([8.8,6.18,11.11,1.8],index=['a','c','d','b'])
# s2 = pd.Series([-9.8,12.12,-1.6,3.5,9.2],index=['a','c','f','d','g'])
# print(s1)
# print(s2)
# print(s1+s2)
# df1 = pd.DataFrame(np.arange(9.).reshape(3,3),columns=list('bcd'),
# index=['Beijing','Shangehai','Changsha'])
# df2 = pd.DataFrame(np.arange(12.).reshape(4,3),columns=list('bde'),
# index=['Shenzhen','Beijing','Changsha','Shangehai'])
# print(df1)
# print(df2)
# print(df1+df2)
# '''dataframe和Series之间的运算'''
# ar = np.arange(12.).reshape((3,4))
# print(ar)
#
# print(ar - ar[0])
df3 = pd.DataFrame(np.arange(9.).reshape(3,3),columns=list('bcd'),
index=['Beijing','Shanghai','Changsha'])
print(df3)
print(df3.iloc[0])
# print(df3-s1)
s3 = pd.Series(range(3),index=['b','e','f'])
print(s3)
print(df3 + s3)
'''函数应用和映射'''
# apply(), map(), applymap()
# apply()对dataframe中的数据进行按行或按列操作
# map() 对Series中的每一个数据操作
# applymap()对Dataframe中的每一个数据操作
df = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),
index=['Shenzhen', 'Beijing', 'Changsha', 'Shanghai'])
np.abs(df) # 取绝对值
f = lambda x: x.max() - x.min()
df.apply(f) # 把f的每列应用f 函数的规则, apply函数的返回值就是函数的返回值,默认是axis=0
df.apply(f, axis=1)
df.apply(f, axis='column') # 等同于axis=1
# 不仅可以返回一个标题,还可以返回由多个值组成的Series
def fun(x):
return pd.Series([x.min(), x.max()], index=['min', 'max'])
df.apply(fun)
# applymap()对元素级别进行操作
# 对上例数据保留2位小数
ff = lambda x: '%.2f' % x # 占位符
df.applymap(ff)
# 设置百分比
fff = lambda x: '{:.2%}'.format(x) # 在设置百分比的同时,保留2位小数
df.applymap(fff)
# map()是针对series的映射
df['e'].map(fff)
# 带有重复索引的标签
# 重复标签
df4 = pd.Series(range(5),index=['a','a','b','c','c'])
print(df4)
df4.index.is_unique
df4.index.unique()
df4['a']
'''练习'''
df1 = pd.DataFrame(np.random.randint(1, 8, (3, 5)))
print(df1)
# 对每列数据加一
df1.apply(lambda x: x + 1)
# 对第列进行求和
df1.sum()
df1.sum(axis=1)
# 对每列数据加上该行的总和
df1.applymap(lambda x: x + df1.sum(1))
'''
1.关于apply的用法,求一个Dataframe的最大值最小值平均值
2.
1)对于上例df,对每列数据后面加上ok;
2)对偶数的数据放大10倍,奇数原样输出;
3.对df的第1列执行处理:如果为偶数,转换为1,否则转换为0
'''
df1.apply(lambda x: [x.max(), x.min(), (x.sum() / len(x))])
df1.applymap(lambda x: (str(x) + 'ok'))
def f(x):
return pd.Series(['{}ok'.format(d) for d in x])
df1.apply(f)
df1.applymap(lambda x: x * 10 if x % 2 == 0 else x)
df1[0].map(lambda x: 1 if x% 2==0 else 0 )
pandas-dataframe索引
最新推荐文章于 2023-06-11 18:43:21 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)