我有3个列表,如以下可重现的示例所示:
year = [2015, 2016, 2017]
month = [1, 2]
ids = ['x', 'y', 'z', 'w']
我要创建的一个非常简单的任务是创建一个最终的数据框,其中我将3列的行作为列值的排列或笛卡尔积进行排序。
类似的东西:
最后,我想添加一个“ Epoque”列,其引用为:2014年12月等于“ 1”,2015年1月等于“ 2”,2015年2月等于“ 3” ,依此类推(依次进行,初始参考为Dec-2014 ='1'(表示“ Epoque”值))...
最终所需的输出将具有以下外观:
编辑:
感谢@jezrael的大力反馈,对问题进行了编辑。他向我提供了缺少以实现所需df的行,但仅缺少“ Epoque”列。
建议的代码如下(缺少所需的“ Epoque”列):
import itertools
s = [ [ 2015, 2016, 2017], [1, 2], ['x', 'y', 'z', 'w'] ]
z = list(itertools.product(*s))
df = pd.DataFrame(z) # Trivial line provided kindly by @jezrael I didn't know.
有关如何有效实现“时代”专栏的任何帮助,我将不胜感激。谢谢。
答案 0 :(得分:1)
在由map
创建的字典中使用date_range
,该字典定义了开始和结束date
:
import itertools
s = [ [ 2015, 2016, 2017], [1, 2], ['x', 'y', 'z', 'w'] ]
z = list(itertools.product(*s))
a = 'Dec-2014'
b = 'Dec-2018'
r = pd.date_range(a, b, freq='MS')
d = dict(zip(r, range(1, len(r) + 1)))
df = pd.DataFrame(z, columns=['year','month','id'])
df['epoch'] = pd.to_datetime(df[['year','month']].assign(day=1)).map(d)
print (df)
year month id epoch
0 2015 1 x 2
1 2015 1 y 2
2 2015 1 z 2
3 2015 1 w 2
4 2015 2 x 3
5 2015 2 y 3
6 2015 2 z 3
7 2015 2 w 3
8 2016 1 x 14
9 2016 1 y 14
10 2016 1 z 14
11 2016 1 w 14
12 2016 2 x 15
13 2016 2 y 15
14 2016 2 z 15
15 2016 2 w 15
16 2017 1 x 26
17 2017 1 y 26
18 2017 1 z 26
19 2017 1 w 26
20 2017 2 x 27
21 2017 2 y 27
22 2017 2 z 27
23 2017 2 w 27
答案 1 :(得分:1)
您可以使用熊猫datetime
:
df = pd.DataFrame(z, columns=['year', 'month', 'id'])
base = pd.Timestamp('2014-12-01')
dates = pd.to_datetime(df[['year', 'month']].assign(day=1))
df['epoch'] = dates.dt.to_period('M') - base.to_period('M') + 1
# alternative
df['epoch'] = (dates.dt.year - base.year)*12 + (dates.dt.month - base.month) + 1
print(df)
year month id epoch
0 2015 1 x 2
1 2015 1 y 2
2 2015 1 z 2
3 2015 1 w 2
4 2015 2 x 3
5 2015 2 y 3
...
18 2017 1 z 26
19 2017 1 w 26
20 2017 2 x 27
21 2017 2 y 27
22 2017 2 z 27
23 2017 2 w 27
答案 2 :(得分:1)
一种解决方案是遍历具有多个for循环的所有变量。
#Set the start date of your epoch (Here november 2014 is epoch 0)
month_0 = 11
year_0 = 2014
year_col = []
month_col = []
id_col = []
epoch_col = []
for j1 in ids:
for j2 in month:
for j3 in year:
year_col.append(j3)
month_col.append(j2)
id_col.append(j1)
epoch = (j3-year_0)*12 +(j2-month_0)
epoch_col.append(epoch)
df = pd.DataFrame({'year':year_col,'month':month_col,'id':id_col,'epoch':epoch_col})