python-在Pandas的3列的笛卡尔乘积后组织行
作者:互联网
我有3个清单,如以下可重现的示例所示:
year = [2015, 2016, 2017]
month = [1, 2]
ids = ['x', 'y', 'z', 'w']
我想创建一个非常简单的任务,即创建一个最终的数据帧,在该数据帧中,我将3列的行作为列值的排列或笛卡尔积进行排序.
就像是:
最后,我想添加一个“ Epoque”列,其引用为:2014年12月等于“ 1”,2015年1月等于“ 2”,2015年2月等于“ 3”,因此on(序列将继续以初始参考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.
对于如何有效实现“时代”专栏的任何帮助,我将不胜感激.谢谢.
解决方法:
您可以使用Pandas日期时间:
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
标签:cartesian-product,pandas,itertools,permutation,python 来源: https://codeday.me/bug/20191108/2008179.html