我正在尝试清理csv文件,所以我检索了年龄列中包含破折号的所有值,并且我有此输出
504 40-49
756 20-29
758 40-89
- 我希望有年龄平均值,而不是将年龄范围记录为 start_age-end_age。 我
- 试图计算平均值,但由于破折号,我无法将其转换为数字。 我预计此输出:
504 45
756 25
- 要创建所需的输出,请添加
age_mean
并删除age_range
。 pandas.Series.str.split
pandas.DataFrame.astype
pandas.DataFrame.mean
pandas.DataFrame.drop
- 创建
age_mean
只需一行代码即可完成,无需创建中间列。 - 根据 Python 3 的舍入行为,
pandas.DataFrame.round
不会像人们期望的那样舍入,所以我将最终答案保留为小数。- 如果需要,可以添加
.round()
.mean(axis=1).round()
。
- 如果需要,可以添加
import pandas as pd
# crate dataframe
df = pd.DataFrame({'id': [504, 756, 758], 'age_range': ['40-49', '20-29', '40-89']})
| | id | age_range |
|---:|-----:|:------------|
| 0 | 504 | 40-49 |
| 1 | 756 | 20-29 |
| 2 | 758 | 40-89 |
# create age_mean
df['age_mean'] = df['age_range'].str.split('-', expand=True).astype('int').mean(axis=1)
# drop age_range
df.drop(columns=['age_range'], inplace=True)
# final dataframe
| | id | age_mean |
|---:|-----:|-----------:|
| 0 | 504 | 44.5 |
| 1 | 756 | 24.5 |
| 2 | 758 | 64.5 |
考虑以下数据帧:
In [966]: df
Out[966]:
a age
0 504 40-49
1 756 20-29
2 758 40-89
您可以这样做:
## split the `age` column into 2 columns
In [971]: df[['start_age','end_age']] = df['age'].str.split('-', expand=True)
## convert these new columns to `int`
In [979]: df.start_age = df.start_age.astype(int)
In [980]: df.end_age = df.end_age.astype(int)
## Take mean of the row and round it.
In [983]: df['mean'] = df[['start_age', 'end_age']].mean(axis=1).round()
如果您只需要 2 列,则可以这样做:
In [986]: df = df[['a', 'mean']]
In [987]: df
Out[987]:
Out[1010]:
a mean
0 504 44.5
1 756 24.5
2 758 64.5