创建一个数据框作为行索引值和列名称的函数?

时间:2015-10-10 17:22:24

标签: python pandas dataframe

创建pandas Data frame作为行索引值和列名称函数的最佳方法是什么?

对于DataFrame,其中X中的索引,Y中的列,每个值都是一些f(x,y),其中X在X中,y在Y中(例如,可以是索引和列名称的串联)

我知道我可以写一个循环来做到这一点,但是想到熊猫有更快的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用列表推导将值准备为列表列表,然后将列表列表传递给pd.DataFrame

import pandas as pd
rows = ['1','2','3']
cols = ['X','Y']

df = pd.DataFrame(([col+row for col in cols] for row in rows),
                  index=rows, columns=cols)

产量

    X   Y
1  X1  Y1
2  X2  Y2
3  X3  Y3

当然,您可以通过调用任意函数col+row来替换f

df = pd.DataFrame(([f(row, col) for col in cols] for row in rows),
                  index=rows, columns=cols)

如果rows和/或cols很大,那么列表列表可能需要大量内存。为每个单元调用一次f可能需要一些时间。根据{{​​1}},可能会有更快/更少内存密集的方式来创建f。 例如,要连接行标签和列标签,可以使用dfnp.char.add

np.meshgrid

产生相同的结果。

这将创建NumPy数组,而不创建临时列表列表,从而节省内存。由于import numpy as np rows = ['1','2','3'] cols = ['X','Y'] df = pd.DataFrame(np.char.add(*np.meshgrid(cols, rows, sparse=True, indexing='xy')), index=rows, columns=cols) 以矢量化方式创建结果NumPy数组,如果np.char.addrows很大,则获得的结果比为每个单元格计算cols(在Python中)更快