pandas数据分组聚合

apply():用于对DataFrame中的数据进行按行或者按列操作

map():用于对Series中的每一个数据操作

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4, 3), columns=list('bcd'), index=['sz', 'sh', 'bj', 'hn'])
print(df)
print('*' * 8)
d1 = df.apply(np.sum, axis=1)  # axis=0 是纵向; =1 是横向
print(d1)
print(df.idxmax())  # 获取最大值对应的标签索引
print(df.idxmin())  # 获取最大、小值对应的标签索引
print('*' * 8)
# 自定义函数来进行映射
f = lambda x: x.max() - x.min()
print(df.apply(f, axis=1))  # 横向最大最小相减


# 返回每一列的最大最小值
def func1(x):
    return pd.Series([x.min(), x.max()], index=['min', 'max'])


print(df.apply(func1))

s = pd.Series(['ap', 'ban', 'org', 'pea'])
price = {'ap': 5, 'org': 3}
print(s.map(price))

# 数据处理

# np.dropna()
a = np.ones((6, 5))
print(a)
for i in range(len(a)):
    a[i, :i] = np.nan
    d = pd.DataFrame(data=a)
print(d)
print(d.dropna())  # 默认是any 只要有空值就删除
print(d.dropna(how='all'))  # 只有全部为空值的才删除  axis=0 表示删除行 axis=1表示删除列 (相反的 lol...)

#空值打的处理办法有两种 删除 或 填充
# 空值填充
print(d.fillna(2))  # 将空值填充为2

# 每列填充不同的值
e = d.fillna({0: 10, 1: 20, 3: 30})
print(e)  # 第一列填充10 第二列填充20 第三列填30
# 差值方式
print(e.fillna(method='ffill'))  # 填充上面的值

# 去重
e1 = pd.DataFrame({'A': [1, 1, 1, 3, 3, 3, 2, 2, 2], 'B': list('aabbbbccc')})
print(e1.drop_duplicates())  # 删除内容一样的行
print(e1.drop_duplicates('A'))  # 针对A例删除

e2 = pd.DataFrame({'k1': list('abc'), 'k2': ['h', np.nan, '123']})
print(e2)
# 把k1变成大写
e2['k3'] = e2['k1'].str.upper()
print(e2)

e3 = pd.DataFrame(np.random.randn(3, 2), columns=['c-A', 'c-B'], index=list('abc'))
print(e3)
e3.columns = e3.columns.str.replace('-', '')
print(e3)

e4 = pd.DataFrame({'k1': ['a-b-c', '1-2-3']})
print(e4)
e4[['k3', 'k4', 'k5']] = e4['k1'].str.split('-', expand=True)
print(e4)

print(e4['k1'].str[0])  # 取k1列的数据的第一个元素

e5 = pd.DataFrame({'name': ['lili le', 'tom mao', 'tonny ma']})
e5['firstname'] = e5['name'].str.split(' ').str[0].str.capitalize()  # 取出firstname 并且首字母大写
print(e5)

#分组聚合

e6=pd.DataFrame({'name':['boss','lili','boss','lili','han','han','boss'],
                'year':[2020,2021,2021,2020,2021,2020,2021],
                'salary':[9999,8888,6666,7777,9811,6869,8987]})
print(e6)

print(e6.groupby('name').count()) #根据名字分组 求出现的次数
print(e6.groupby(['name', 'year']).sum()) #根据名字和年度分组 求出每年发了多少钱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值