数据分析问题-根据混合列来计算年龄

时间:2019-03-13 08:58:42

标签: pandas dataframe series

所以我搜寻了互联网,试图弄清楚该怎么做,但没有成功。我有大约5,000行的数据集,但为简单起见,在下面做了这个数据框。我想计算年龄(以月为单位的数字除以12),但是我不知道如何让python识别数字。您能给我指出什么想法或方向吗?

test = (3, 6, 1, '7 m', '8 m', 5, 11, '10 m','almost 4 m', '9 y & m', '3 Yr 7 mths')
test_list = list(test) 
test_series = pd.Series(test_list) 
df_test = pd.DataFrame(test_series) 
df_test.rename(columns = {0:'Key'}, inplace = True)
df_test['Years_Old'] = np.nan df_test

1 个答案:

答案 0 :(得分:0)

使用正则表达式,我们可以首先提取子字符串,例如“ [数字] [空格(可选)] [y或m(可选)]”(不区分大小写),然后将[数字]乘以1/12 [y或m]为“ m”(因为我们正在计算年数),然后将其总计为每条记录:

import re

z = df_test['Key'].astype(str).str.extractall('(\d+)\s*([mMyYwW])?').fillna('m').astype({0: int, 1: str})
df_test['Years_Old'] = (z[0] * z[1].str.lower().map({'y': 1, 'm': 1/12, 'w': 1/52})).groupby(level=0).sum()

print(df_test)

输出:

            Key  Years_Old
0             3   0.250000
1             6   0.500000
2             1   0.083333
3           7 m   0.583333
4           8 m   0.666667
5             5   0.416667
6            11   0.916667
7          10 m   0.833333
8    almost 4 m   0.333333
9       9 y & m   9.000000
10  3 Yr 7 mths   3.583333
11         10 w   0.192308

注意:

  1. 默认情况下,如果未给出y / m,我假设是几个月,但是如果需要,可以使用.fillna('y')而不是.fillna('m')行上的z = ...切换到年份
  2. 不确定“ 9 y&m”的含义,因此将其视为仅9年