【问题标题】:create a Data frame as a function of row index value and column name?根据行索引值和列名创建数据框?
【发布时间】:2015-10-10 17:22:24
【问题描述】:

根据行索引值和列名创建 pandas 数据框的最佳方法是什么?

所以对于 X 中的索引,Y 中的列的 DataFrame,每个值将是一些 f(x,y),其中 X 中的 x 和 Y 中的 y(例如,可以是索引和列名的连接)

我知道我可以编写一个循环来执行此操作,但认为 pandas 中有更快的方法吗?

谢谢!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以使用列表推导将值准备为列表列表,然后将列表列表传递给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.addnp.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 数组,因此如果 rowscols 很大,则获得结果的速度比为每个单元格计算 col+row(在 Python 中)要快。

    【讨论】:

    • 谢谢,这很有帮助。我不想进行字符串连接- f(x,y) 将调用 difflib 以查看 x 和 y 字符串的相似程度。我实际上是在尝试通过删除那些(可能)重复的名字来清理一长串名字。所以我想问题是调用外部函数最有效的方法是什么?
    猜你喜欢
    • 2016-11-14
    • 2019-12-04
    • 2021-08-24
    • 2019-11-07
    • 1970-01-01
    • 2022-01-21
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多