0
作为行索引值和列名称的函数,创建熊猫数据框的最佳方法是什么?创建一个数据框作为行索引值和列名的函数?
所以对于数据帧,其中在X索引,列在Y,每个值将是一些F(X,Y),其中x在X和Y在Y(例如可以是索引和列名的串联)
我知道我可以写一个循环来做到这一点,但是熊猫有更快的方法吗?
谢谢!
作为行索引值和列名称的函数,创建熊猫数据框的最佳方法是什么?创建一个数据框作为行索引值和列名的函数?
所以对于数据帧,其中在X索引,列在Y,每个值将是一些F(X,Y),其中x在X和Y在Y(例如可以是索引和列名的串联)
我知道我可以写一个循环来做到这一点,但是熊猫有更快的方法吗?
谢谢!
你可以用一个列表理解为一个列表的列表准备的值,然后列出清单传递给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)更快。
谢谢这是有帮助的。我没有尝试进行字符串连接 - f(x,y)将调用difflib来查看x和y字符串的相似程度。我基本上是通过摆脱那些可能是重复的东西来清理一长串名字。所以我想问题是调用外部函数的最有效方法是什么? –