将表格或矩阵从python扩展为包含列及其值的信息的行的最佳解决方案(性能)是什么?
我们说我们已经在Pandas中加载了一个表格如下:
Date A B
t1 1 2
t2 3 4
我想爆炸表,所以它变成了一系列4行,如下所示:
t1-A-1
t1-B-2
t2-A-3
t2-C-4
如果原始表格中有数十列和数百行,性能就是关键。
以下内容如何:
Date A B C
t1 1 5 9
t1 2 6 10
t2 3 7 11
t2 4 8 12
输出系列将是:
Date code
t1 "str1"1"str2"B"str2"5
t1 "str1"2"str2"B"str2"6
t2 "str1"3"str2"B"str2"7
t2 "str1"4"str2"B"str2"8
.. ..
t2 "str1"4"str2"C"str2"12
感谢您的帮助!
答案 0 :(得分:3)
如果表现是关键......请使用numpy
from numpy.core.defchararray import add as cadd
from functools import reduce
def proc(d1):
v = d1.values
n, m = v.shape
dates = np.repeat(d1.index.values.astype(str), m)
cols = np.tile(d1.columns.values.astype(str), n)
vals = v.ravel().astype(str)
return pd.Series(reduce(cadd, [dates, '-', cols, '-', vals]))
proc(df.set_index('Date'))
0 t1-A-1
1 t1-B-2
2 t2-A-3
3 t2-B-4
dtype: object
计时
%timeit proc(df.set_index('Date'))
%timeit df.set_index('Date').stack().reset_index().apply(lambda x: '-'.join(x.astype(str)), axis=1)
小数据
1000 loops, best of 3: 494 µs per loop
100 loops, best of 3: 2.17 ms per loop
大数据
from string import ascii_letters
np.random.seed([3,1415])
df = pd.DataFrame(
np.random.randint(10, size=(1000, 52)),
pd.Index(['t{:05d}'.format(i) for i in range(1000)], name='Date'),
list(ascii_letters)
).reset_index()
10 loops, best of 3: 156 ms per loop
1 loop, best of 3: 3.75 s per loop
答案 1 :(得分:2)
df.set_index('Date').stack().reset_index().apply(lambda x: '-'.join(x.astype(str)), axis=1)
输出:
0 t1-A-1
1 t1-B-2
2 t2-A-3
3 t2-B-4
dtype: object