首页 > 解决方案 > 创建从年份“开始”到“结束”的表

问题描述

我有一个清单。大多与讣告有关。

Leonard Wilson 1867 - 1936
Mark Jonson 1892 - 1961
Alex Jean Kinshaw 1951 - 1993
Elizabeth Mae Martin 1934 - 1998

数据需要为研究进行分析,并且需要以“csv”格式排列,时间线(用“,”分隔,空值使用“-”)从 1850 年到 2015 年。

Leonard Wilson,-,-,-,-,-,-,-,-,-,-,-,-,-,-,1867,1868,1869......1934,1935,1936,-,-,-,-,-,-,-,-,-,-,-,-
Mark Jonson,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,1892,1893,1894,1895,1896,1897......,1958,1959,1960,1961,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-
....


# All years in the middle needs to be populated please

在上面的数据中你可以看到这个人出生前的年份用'-'标记,死后的年份(直到2015年)也一样。在这之间的所有年份,都需要填充。

python/pandas 代码需要检测开始和结束的年份,以及

  1. 填充之前的空值
  2. 中年和
  3. 结束空值

无论如何这可以实现,因为我有超过 30k 行的数据?

标签: python-3.xpandastext-parsing

解决方案


是的,你可以这样做:

df = pd.read_clipboard(header=None, sep='\s\s+')

df_a = df[0].str.rsplit(n=3, expand=True)

df_a = df_a.set_index(0)

full_range = pd.date_range('12/31/1850', '12/31/2015', freq='AS') 
df_a['range'] = [','.join(pd.date_range(i, j, freq='AS')
                            .to_series()
                            .dt.strftime('%Y')
                            .reindex(full_range, fill_value='-')) for i, j in zip(df_a[1], df_a[3])]

df_a.to_csv('test.csv')

输出:

在此处输入图像描述


推荐阅读