【发布时间】:2015-10-10 17:22:24
【问题描述】:
根据行索引值和列名创建 pandas 数据框的最佳方法是什么?
所以对于 X 中的索引,Y 中的列的 DataFrame,每个值将是一些 f(x,y),其中 X 中的 x 和 Y 中的 y(例如,可以是索引和列名的连接)
我知道我可以编写一个循环来执行此操作,但认为 pandas 中有更快的方法吗?
谢谢!
【问题讨论】:
根据行索引值和列名创建 pandas 数据框的最佳方法是什么?
所以对于 X 中的索引,Y 中的列的 DataFrame,每个值将是一些 f(x,y),其中 X 中的 x 和 Y 中的 y(例如,可以是索引和列名的连接)
我知道我可以编写一个循环来执行此操作,但认为 pandas 中有更快的方法吗?
谢谢!
【问题讨论】:
您可以使用列表推导将值准备为列表列表,然后将列表列表传递给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 可能需要一些时间。根据f,可能有一种更快/更少内存密集型的方法来创建df。
例如,要连接行标签和列标签,您可以使用np.char.add 和np.meshgrid:
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 以向量化方式创建结果 NumPy 数组,因此如果 rows 和 cols 很大,则获得结果的速度比为每个单元格计算 col+row(在 Python 中)要快。
【讨论】: