所以我试图弄清楚互联网如何做到这一点,但我没有成功。我有一个大约5,000行的数据集,但为简单起见,下面是这个数据框。我想计算IN年份的年龄(即带月数的数字除以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
使用正则表达式,我们可以首先提取子句,如“[number] [space(s)(optional)] [y或m(optional)]”(不区分大小写),然后将[number] s乘以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
笔记:
.fillna('y')
线上的.fillna('m')
而不是z = ...