将表扩展为pandas中的行

时间:2017-06-22 20:35:52

标签: pandas

将表格或矩阵从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

感谢您的帮助!

2 个答案:

答案 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