我有Pandas Dataframe ,包含以下数据
ID Q1_rev Q1_transcnt Q2_rev Q2_transcnt Q3_rev Q3_transcnt Q4_rev Q4_transcnt
1 100 2 200 4 300 6 400 8
2 101 3 201 5 301 7 401 9
Dataframe 如下所示
我想做以下几点
a)对于每个ID,创建3行(来自8个输入列数据)
b)每行应包含两列数据
c)随后的行应该将列移位1(四分之一数据)。
为了更好地理解,我希望我的输出如下所示
我尝试了下面的基础上,所以职位在这里,但无法获得预期的输出
s = 3
n = 2
cols = ['1st_rev','1st_transcnt','2nd_rev','2nd_transcnt']
output = pd.concat((df.iloc[:,0+i*s:6+i*s].set_axis(cols, axis=1) for i in range(int((df.shape[1]-(s*n))/n))), ignore_index=True, axis=0).set_index(np.tile(df.index,2))
能帮我一下吗?问题是实时的,n=2
不会是这样的。它也可能是4或5。意思是,我可能有下面的,而不是'1st_rev','1st_transcnt','2nd_rev','2nd_transcnt'
。你可以看到有4对列。
'1st_rev','1st_transcnt','2nd_rev','2nd_transcnt','3rd_rev','3rd_transcnt','4th_rev','4th_transcnt'
2条答案
按热度按时间t98cgbkg1#
通过按
_
拆分列名并按x.split('_')[1]
拆分选定的第二个子字符串,使用DataFrame.groupby
的自定义函数:使用3个窗口进行测试:
eit6fx6z2#
一个选项是for循环或列表解析,后跟连接和排序:
为了使它更通用,可以使用while循环(你可以使用for循环-while循环看起来更可读/更容易理解):
让我们应用这个函数: