Python 将数据帧列转换为行

Python 将数据帧列转换为行,python,pandas,Python,Pandas,我有一个大的Pandas数据框,包含2002列和258行,其中每列表示一种产品,每行表示给定日期每种产品的销售额 我想将其转换为一个包含2002*258=516516行和2列(包含产品名称和销售额)的Pandasdataframe。如何在Python中有效地执行此操作 以下数据可作为示例: d = {'Product 1': [1, 2], 'Product 2': [3, 4], 'Product 3': [1, 1]} df = pd.DataFrame(data=d) 我认为需要加倍努力

我有一个大的
Pandas
数据框,包含2002列和258行,其中每列表示一种产品,每行表示给定日期每种产品的销售额

我想将其转换为一个包含2002*258=516516行和2列(包含产品名称和销售额)的
Pandas
dataframe。如何在
Python
中有效地执行此操作

以下数据可作为示例:

d = {'Product 1': [1, 2], 'Product 2': [3, 4], 'Product 3': [1, 1]}
df = pd.DataFrame(data=d)
我认为需要加倍努力:

使用或和获得更好性能的替代方案:


计时

np.random.seed(145)

#[258 rows x 2002 columns]
df = pd.DataFrame(np.random.randint(100, size=(258,2002))).add_prefix('Product ')
#print (df)


In [112]: %timeit pd.DataFrame({'a':np.tile(df.columns, len(df)), 'b':df.values.ravel()})
100 loops, best of 3: 12.6 ms per loop

In [113]: %timeit pd.DataFrame({'a':np.repeat(df.columns, len(df)), 'b':df.values.T.ravel()})
100 loops, best of 3: 10.8 ms per loop

In [114]: %timeit df.reset_index().melt(id_vars='index', var_name='product', value_name='sales')
100 loops, best of 3: 18 ms per loop

In [115]: %timeit df.stack().reset_index(level=0, drop=True).rename_axis('a').reset_index(name='b')
10 loops, best of 3: 27.8 ms per loop

In [116]: %timeit df.unstack().swaplevel().sort_index()
10 loops, best of 3: 156 ms per loop
编辑:

我认为需要加倍努力:

使用或和获得更好性能的替代方案:


计时

np.random.seed(145)

#[258 rows x 2002 columns]
df = pd.DataFrame(np.random.randint(100, size=(258,2002))).add_prefix('Product ')
#print (df)


In [112]: %timeit pd.DataFrame({'a':np.tile(df.columns, len(df)), 'b':df.values.ravel()})
100 loops, best of 3: 12.6 ms per loop

In [113]: %timeit pd.DataFrame({'a':np.repeat(df.columns, len(df)), 'b':df.values.T.ravel()})
100 loops, best of 3: 10.8 ms per loop

In [114]: %timeit df.reset_index().melt(id_vars='index', var_name='product', value_name='sales')
100 loops, best of 3: 18 ms per loop

In [115]: %timeit df.stack().reset_index(level=0, drop=True).rename_axis('a').reset_index(name='b')
10 loops, best of 3: 27.8 ms per loop

In [116]: %timeit df.unstack().swaplevel().sort_index()
10 loops, best of 3: 156 ms per loop
编辑:

另一种选择:

df = df.unstack().swaplevel().sort_index()
print(df)

0  Product 1    1
   Product 2    3
   Product 3    1
1  Product 1    2
   Product 2    4
   Product 3    1
或者,如果不需要按第一个索引排序:

df = df.unstack().swaplevel()
print(df)

0  Product 1    1
1  Product 1    2
0  Product 2    3
1  Product 2    4
0  Product 3    1
1  Product 3    1
另一种选择:

df = df.unstack().swaplevel().sort_index()
print(df)

0  Product 1    1
   Product 2    3
   Product 3    1
1  Product 1    2
   Product 2    4
   Product 3    1
或者,如果不需要按第一个索引排序:

df = df.unstack().swaplevel()
print(df)

0  Product 1    1
1  Product 1    2
0  Product 2    3
1  Product 2    4
0  Product 3    1
1  Product 3    1
您可以使用:

将为您提供:

   index    product  sales
0      0  Product 1      1
1      1  Product 1      2
2      0  Product 2      3
3      1  Product 2      4
4      0  Product 3      1
5      1  Product 3      1
其中
索引
这里是有效的日期指示器(必要时可适当重命名)。

您可以使用:

将为您提供:

   index    product  sales
0      0  Product 1      1
1      1  Product 1      2
2      0  Product 2      3
3      1  Product 2      4
4      0  Product 3      1
5      1  Product 3      1

其中
index
这里是有效的日期指示符(必要时可适当重命名)。

我认为解决方案会生成索引列,但在我的实际示例中,这不起作用,可能是日期时间格式。你知道如何使用datetime吗?别介意我之前的评论。我只需要将“index”替换为“date”,这是数据帧中索引列的名称。我认为解决方案会生成索引列,但在我的实际示例中,这不起作用,可能是datetime格式。你知道如何使用datetime吗?别介意我之前的评论。我只需要将“index”替换为“date”,这是我的数据帧中索引列的名称。我喜欢你的第三个方法的速度,但是有没有办法将它扩展到包含日期的第一列?给我一些时间谢谢,就是这样。请注意
df.unstack().swaplevel().sort_index()
根据末尾的第一个索引进行排序(我认为这是必要的)。运行df.unstack().swaplevel()来获得相同的结果实际上似乎是最快的…@jdehesa-OP需要最快的解决方案,所以我只需对所有解决方案进行计时。但在我看来,OP需要数据帧,所以你需要重置索引。但是因为需要最快的解决方案,所以不确定是否可以用一些pandas解决方案在这里击败
numpy
。我喜欢你第三种方法的速度,但是有没有办法扩展它以包括包含日期的第一列?给我一些时间谢谢,就是这样。注意
df.unstack().swaplevel().sort_index()
根据末尾的第一个索引进行排序(我认为这是必要的)。运行df.unstack().swaplevel()来获得相同的结果实际上似乎是最快的…@jdehesa-OP需要最快的解决方案,所以我只需对所有解决方案进行计时。但在我看来,OP需要数据帧,所以你需要重置索引。但是因为需要最快的解决方案,所以不确定是否有可能在这里用一些解决方案击败numpy。
   index    product  sales
0      0  Product 1      1
1      1  Product 1      2
2      0  Product 2      3
3      1  Product 2      4
4      0  Product 3      1
5      1  Product 3      1