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