Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数据帧拆分为相应命名的数组或系列(然后重新组合)_Python_Pandas_Numpy_Numba - Fatal编程技术网

Python 将数据帧拆分为相应命名的数组或系列(然后重新组合)

Python 将数据帧拆分为相应命名的数组或系列(然后重新组合),python,pandas,numpy,numba,Python,Pandas,Numpy,Numba,假设我有一个包含x列和y列的数据框。我希望自动将其拆分为与列具有相同名称的数组(或系列),处理数据,然后稍后重新连接它们。手动执行此操作非常简单: x, y = df.x, df.y z = x + y # in actual use case, there are hundreds of lines like this df = pd.concat([x,y,z],axis=1) 但我想让它自动化。很容易获得带有df.columns的字符串列表,但我确实想要[x,y],而不是['x','

假设我有一个包含x列和y列的数据框。我希望自动将其拆分为与列具有相同名称的数组(或系列),处理数据,然后稍后重新连接它们。手动执行此操作非常简单:

x, y = df.x, df.y
z = x + y   # in actual use case, there are hundreds of lines like this
df = pd.concat([x,y,z],axis=1)
但我想让它自动化。很容易获得带有df.columns的字符串列表,但我确实想要[x,y],而不是['x','y']。到目前为止,我能做的最好的事情就是与exec一起解决这个问题:

df_orig = DataFrame({ 'x':range(1000), 'y':range(1000,2000),  'z':np.zeros(1000) })

def method1( df ):

   for col in df.columns:
      exec( col + ' = df.' + col + '.values')

   z = x + y   # in actual use case, there are hundreds of lines like this

   for col in df.columns:   
      exec( 'df.' + col + '=' + col )

df = df_orig.copy() 
method1( df )         # df appears to be view of global df, no need to return it
df1 = df
因此有两个问题:

1) 像这样使用exec通常不是一个好主意(当我尝试将它与numba结合使用时,已经给我带来了一个问题)——或者这是一个坏主意?它似乎可以很好地用于系列和阵列

2) 我不确定利用这里的风景的最佳方式。理想情况下,我在这里真正想做的就是使用x作为df.x的视图。我假设在x是数组的情况下这是不可能的,但如果x是一个级数,这可能是不可能的

上面的示例是针对阵列的,但理想情况下,我正在寻找一种也适用于系列的解决方案。取而代之的是,与其中一个或另一个协同工作的解决方案当然是受欢迎的

动机:

1) 可读性,可以通过eval部分实现,但我不相信eval可以在多行上使用


2) 对于z=x+y这样的多行,这种方法对于串联(在我尝试过的示例中是2x或3x)更快,对于阵列(超过10x)更快。请参见此处:

只需使用索引符号和字典,而不是属性符号

df_orig = DataFrame({ 'x':range(1000), 'y':range(1000,2000),  'z':np.zeros(1000) })

def method1( df ):

   series = {}
   for col in df.columns:
      series[col] = df[col]

   series['z'] = series['x'] + series['y']   # in actual use case, there are hundreds of lines like this

   for col in df.columns:   
      df[col] = series[col]

df = df_orig.copy() 
method1( df )         # df appears to be view of global df, no need to return it
df1 = df

这并不是你想要的,而是另一条思考的道路

这里有一个要点,它定义了一个上下文管理器,允许您像引用本地列一样引用列。这不是我写的,它有点旧,但似乎仍然适用于熊猫的当前版本

In [45]: df = pd.DataFrame({'x': np.random.randn(100000), 'y': np.random.randn(100000)})

In [46]: with DataFrameContextManager(df):
    ...:     z = x + y
    ...:     

In [47]: z.head()
Out[47]: 
0   -0.821079
1    0.035018
2    1.180576
3   -0.155916
4   -2.253515
dtype: float64

我假设您的操作太复杂,但您是否考虑过只使用
df.eval
?我想除了稍微缩短代码之外,我很难看到其他目标?您可以使用下标操作符访问列,如so
df[col]
这里的col可以是字符串,这比使用
exec
麻烦得多。请注意,“z=x+y”只是可能超过1000行代码的占位符。对于这么多行代码来说,去掉额外的df对我来说是值得的。或者df[]围绕每件事,但更重要的是速度的显著提高。你可以举一个例子,说明在哪里可以提高速度?@chrisb benchmarks谢谢,我来看看。我在这里问了一个相关的问题,答案也涉及到上下文管理器。它看起来确实很有趣,我必须探索并更好地了解上下文管理器是如何工作的。谢谢Mark,我想我可以将这个字典解决方案与chrisb的上下文管理器结合起来,以获得一个相当完整的解决方案,尽管这已经开始变得复杂。。。