pandas-dataframe索引

'''创建多级索引'''
# 隐式创建
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 )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弓早早o_O

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值