写空数据帧或面板而不循环索引的有效方法?

2024-07-05 11:22:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有一种更好的方法可以在不使用.loc[index]逐行赋值的情况下将值写入panel或dataframe对象。你知道吗

下面是一个示例(设置空面板):

items = ['item1','item2','item3']
major_axis = np.arange(10)
minor_axis = ['A','B','C','D']

data = np.ndarray(shape=(3,10,4), dtype='d')
data[:] = np.NaN

面板创建:

    myPanel=pd.Panel(data=data,items=items, major_axis=major_axis, minor_axis= minor_axis)

假设我想在遍历面板项时,为结果数据帧的每一行编写一个数组。在循环的形式,它似乎真的傻乎乎的,不是很有效率。你知道吗

for item in myPanel.items:
    for idx in myPanel[item].index:
        myPanel[item].loc[idx] = np.array([4,3,2,1])

我一直想用数据帧.apply()和面板.应用()使用lambda,以便更好地执行此操作,但在实际使用apply方法编写值时遇到了问题。你知道吗

下面是我无力的解决办法:

定义一个将写入数据帧的每一行的函数:

def f(x): return np.array([4,3,2,1])

然后做这样的事,但以一种实际可行的方式?你知道吗

myPanel.apply(lambda x: x.apply(f(x.loc[x.index])), axis = [0,1])

我敢肯定,这可能是一个坏的形式,即使它确实工作。你知道吗

其思想是,最内部的apply将对数据帧的每一行进行操作,这些数据帧是由最外部的apply()操作产生的。你知道吗

这是愚蠢的努力吗?apply()是否仍像循环一样工作,但设计用于引用dataframe/panel-like对象中已存储的值的操作,而不是用于设置值?你知道吗

更新: 我在这里没有很好地说明我的目标,所以我将尝试详细说明。我还认为我把几个问题组合成了一个大而晦涩的问题。你知道吗

我的主要目标是确定在小组中写入单个值的最佳(最有效)方法。我正在处理的代码引用了我在初始化过程中创建的一个空面板(填充了NaN),然后在稍后的某个时候继续用实际的数字数据覆盖这些值。你知道吗

我不完全确定我想如何设计将数据写入空面板的方法。我很好奇使用apply()方法,而不是在循环中手动选择面板的某个维度,因为apply()似乎会自动在一个轴上迭代,并允许在这个轴上同时执行某种变换。你知道吗

为了达到这个目的,我正在考虑设计一个函数来处理写数据帧的各个行所做的“工作”,或者使用数据框应用(write_row_function))或只是迭代数据帧的索引测向位置[i] =写入行函数()。你知道吗

对于包含面板,我正在考虑以以下方式再次使用apply:面板.应用(将数据帧写入面板函数,轴=0(?)或通过以下方式迭代:

for i in Panel.items:
     Panel[i] = write_dataframe_to_panel_function()

我的apply()问题涉及到不确定如何使用它在apply()方法中的该位置用来自函数的数据一次性更新自身。你知道吗

一天结束时,我开始质疑尝试使用apply()的有用性,因为它似乎表现为一个循环,并且似乎不是特别容易使用,因为它是一种将新数据写入axis的方法apply()正在逐步执行。你知道吗

如果以这种方式使用apply()没有性能优势,或者我忽略了一个主要的功能,那么我希望社区的见解能够引导我朝着更高效的方向发展。你知道吗

我希望这比我最初的尝试更清楚一点。如果没有,我会继续努力:)


Tags: 数据方法函数面板dataframedataindexnp