将年龄按性别分类和五岁为组距进行分组统计代码
时间: 2024-09-28 07:03:11 浏览: 40
在Python中,我们可以使用pandas库来进行这样的数据分析。假设我们有一个名为`df`的DataFrame,其中包含`age`和`gender`两列,以下是将年龄按性别分类并以5岁为组距进行分组统计的代码示例:
```python
import pandas as pd
# 假设df是你的数据框
df = pd.DataFrame({
'age': [20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75],
'gender': ['Male', 'Female', 'Male', 'Male', 'Female', 'Female', 'Male', 'Male', 'Female', 'Female', 'Male', 'Male']
})
# 按性别和每5岁一组进行分组,并计算每个组的平均年龄
grouped_age = df.groupby(['gender', pd.cut(df['age'], bins=range(0, 85, 5))])['age'].mean()
print(grouped_age)
```
这段代码首先使用`pd.cut`函数将年龄列按照5岁的组距进行切分,然后使用`groupby`函数按性别和年龄组进行分组。最后,对于每个组,它计算出该组内年龄的平均值。
相关问题
Postgresql按年龄段和性别分组统计
可以使用PostgreSQL的GROUP BY和CASE语句来按年龄段和性别分组统计,示例代码如下:
```
SELECT
CASE
WHEN age BETWEEN 0 AND 18 THEN '0-18'
WHEN age BETWEEN 19 AND 30 THEN '19-30'
WHEN age BETWEEN 31 AND 45 THEN '31-45'
WHEN age BETWEEN 46 AND 60 THEN '46-60'
ELSE '60+'
END AS age_group,
gender,
COUNT(*)
FROM
your_table
GROUP BY
age_group,
gender
```
这个查询会将年龄分为五个段落:0-18、19-30、31-45、46-60、60+,然后按照年龄段和性别分组统计记录数。你可以将`your_table`替换为你自己的表名,`age`和`gender`替换为你自己的列名。
1、 参考上课讲授内容,使用pandas库读入一个数据文件data.csv, DataFrame对象展示内容如下所示: 这是一家服装店统计的会员数据。最上面的一行是列坐标,最左侧一 列是行坐标。列坐标中,第 0 列代表的是序号,第 1 列代表的会员 的姓名,第 2 列代表年龄,第 3 列代表体重,第 4~6 列代表男性 会员的三围尺寸,第 7~9 列代表女性会员的三围尺寸。 (1) 删除值全为Nan的行,删除序号列。 (2) 对df对象进行列索引标识。 (3) 年龄中的Nan值用年龄的均值替换。 (4) 将体重列中单位为kgs的数据全部变换成单位为lbs的数据 (1kgs=2.2lbs),再去除lbs后缀。 (5) 将体重列中Nan值用体重的均值替换。 (6) 剔除会员姓名列中的异常字符,再将会员的姓名划分为姓和名 两列。 (7) 将女性会员的腰围列中的Nan用女性腰围的均值替换。 (8) 在df对象中增加一个性别列,男性值为“1”,女性值 为”0”。 (9) 将df中男性的三围数据列和女性的三围数据列合并。 (10) 在df对象中只保存会员的姓、名、性别、年龄、体重、胸围、 腰围、臀围共8列数据,按性别分组,统计输出男性、女性的年 龄、体重及三围数据的均值、方差和中位数。\
好的,以下是针对您提供的数据文件data.csv的处理代码,使用的是Python中的pandas库:
```python
import pandas as pd
# 读取数据文件
df = pd.read_csv('data.csv')
# (1) 删除值全为Nan的行,删除序号列
df.dropna(how='all', inplace=True) # 删除值全为Nan的行
df.drop(columns=['序号'], inplace=True) # 删除序号列
# (2) 对df对象进行列索引标识
columns = ['姓名', '年龄', '体重', '胸围', '腰围', '臀围']
columns.extend(['{}'.format(i) for i in range(1, 4)])
columns.extend(['{}'.format(i) for i in range(4, 7)])
df.columns = columns
# (3) 年龄中的Nan值用年龄的均值替换
df['年龄'].fillna(df['年龄'].mean(), inplace=True)
# (4) 将体重列中单位为kgs的数据全部变换成单位为lbs的数据 (1kgs=2.2lbs),再去除lbs后缀
def kg_to_lbs(x):
if pd.isna(x):
return x
else:
return float(x[:-3]) * 2.2
df['体重'] = df['体重'].apply(kg_to_lbs)
# (5) 将体重列中Nan值用体重的均值替换
df['体重'].fillna(df['体重'].mean(), inplace=True)
# (6) 剔除会员姓名列中的异常字符,再将会员的姓名划分为姓和名两列
def clean_name(name):
# 剔除异常字符
name = name.replace('·', '')
name = name.replace(' ', '')
# 划分为姓和名两列
if len(name) == 2:
return name[0], name[1]
else:
return name[:2], name[2:]
df['姓'], df['名'] = zip(*df['姓名'].apply(clean_name))
# (7) 将女性会员的腰围列中的Nan用女性腰围的均值替换
df.loc[df['性别'] == 0, '腰围'].fillna(df.loc[df['性别'] == 0, '腰围'].mean(), inplace=True)
# (8) 在df对象中增加一个性别列,男性值为“1”,女性值为”0“
df['性别'] = df['胸围'].apply(lambda x: 1 if pd.notna(x) else 0)
# (9) 将df中男性的三围数据列和女性的三围数据列合并
df_male = df[df['性别'] == 1][['胸围', '腰围', '臀围']]
df_male.columns = ['男性胸围', '男性腰围', '男性臀围']
df_female = df[df['性别'] == 0][['胸围', '腰围', '臀围']]
df_female.columns = ['女性胸围', '女性腰围', '女性臀围']
df = pd.concat([df, df_male, df_female], axis=1)
# (10) 在df对象中只保存会员的姓、名、性别、年龄、体重、胸围、腰围、臀围共8列数据,按性别分组,统计输出男性、女性的年龄、体重及三围数据的均值、方差和中位数
df_new = df[['姓', '名', '性别', '年龄', '体重', '胸围', '腰围', '臀围']]
grouped = df_new.groupby('性别')
for name, group in grouped:
print('性别为{}的数据:'.format(name))
print('年龄均值:{}'.format(group['年龄'].mean()))
print('年龄方差:{}'.format(group['年龄'].var()))
print('年龄中位数:{}'.format(group['年龄'].median()))
print('体重均值:{}'.format(group['体重'].mean()))
print('体重方差:{}'.format(group['体重'].var()))
print('体重中位数:{}'.format(group['体重'].median()))
print('胸围均值:{}'.format(group['胸围'].mean()))
print('胸围方差:{}'.format(group['胸围'].var()))
print('胸围中位数:{}'.format(group['胸围'].median()))
print('腰围均值:{}'.format(group['腰围'].mean()))
print('腰围方差:{}'.format(group['腰围'].var()))
print('腰围中位数:{}'.format(group['腰围'].median()))
print('臀围均值:{}'.format(group['臀围'].mean()))
print('臀围方差:{}'.format(group['臀围'].var()))
print('臀围中位数:{}'.format(group['臀围'].median()))
```
阅读全文