创建pandas Data frame作为行索引值和列名称函数的最佳方法是什么?
对于DataFrame,其中X中的索引,Y中的列,每个值都是一些f(x,y),其中X在X中,y在Y中(例如,可以是索引和列名称的串联)
我知道我可以写一个循环来做到这一点,但是想到熊猫有更快的方法吗?
谢谢!
答案 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
。
例如,要连接行标签和列标签,可以使用df
和np.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.add
和rows
很大,则获得的结果比为每个单元格计算cols
(在Python中)更快