Pandas 熊猫每行应用多个列,而不是列表

Pandas 熊猫每行应用多个列,而不是列表,pandas,apply,Pandas,Apply,在使用apply时,我很难让pandas返回多个列 例如: import pandas as pd import numpy as np np.random.seed(1) df = pd.DataFrame(index=range(2), columns=['a', 'b']) df.loc[0] = [np.array((1,2,3))], 1 df.loc[1] = [np.array((4,5,6))], 1 df a b 0 [[1, 2, 3]]

在使用apply时,我很难让pandas返回多个列

例如:

import pandas as pd
import numpy as np
np.random.seed(1)

df = pd.DataFrame(index=range(2), columns=['a', 'b'])
df.loc[0] = [np.array((1,2,3))], 1
df.loc[1] = [np.array((4,5,6))], 1
df

             a  b
0  [[1, 2, 3]]  1
1  [[4, 5, 6]]  1

df2 = np.random.randint(1,9, size=(3,2))
df2

array([[4, 6],
       [8, 1],
       [1, 2]])

def example(x):
    return np.transpose(df2) @ x[0]

df3 = df['a'].apply(example)
df3

0    [23, 14]
1    [62, 41]
我希望df3有两列,每列每行一个元素,而不是一列每行两个元素

所以我想要像这样的东西

df3Wanted
         col1  col2
    0    23    14
    1    62    41

有人知道如何解决这个问题吗?

要实现这一点,需要进行几项更改:

更新下面的功能如下

def example(x):
    return [np.transpose(df2) @ x[0]]
并对
df3

wantedDF3 = pd.concat(df3.apply(pd.DataFrame, columns=['col1','col2']).tolist())
打印(WANTEDF3)
提供所需的输出:

 col1  col2
0    40    12
0    97    33
编辑: 为避免内存错误问题,执行相同操作的另一种方法是: 保持您的
示例
函数和
df3
不变(与问题相同) 现在,在上面,使用下面的代码生成
wantedDF3

col1df = pd.DataFrame(df3.apply(lambda x: x[0]).values, columns=['col1'])
col2df = pd.DataFrame(df3.apply(lambda x: x[1]).values,  columns=['col2'])
wantedDF3 = col1df.join(col2df)

要实现这一点,需要进行几项更改:

更新下面的功能如下

def example(x):
    return [np.transpose(df2) @ x[0]]
并对
df3

wantedDF3 = pd.concat(df3.apply(pd.DataFrame, columns=['col1','col2']).tolist())
打印(WANTEDF3)
提供所需的输出:

 col1  col2
0    40    12
0    97    33
编辑: 为避免内存错误问题,执行相同操作的另一种方法是: 保持您的
示例
函数和
df3
不变(与问题相同) 现在,在上面,使用下面的代码生成
wantedDF3

col1df = pd.DataFrame(df3.apply(lambda x: x[0]).values, columns=['col1'])
col2df = pd.DataFrame(df3.apply(lambda x: x[1]).values,  columns=['col2'])
wantedDF3 = col1df.join(col2df)

这是对第一个答案评论的回答,涉及内存错误问题。下面的示例使用了给出我的计算机内存错误的数据,以及迄今为止建议的所有方法(第一个答案和第一个答案中的注释),但它与下面的代码一起工作:

import pandas as pd
import numpy as np
import time
np.random.seed(1)

nRows = 25000
nCols = 10000
numberOfChunks = 5

df = pd.DataFrame(index=range(nRows ), columns=range(1))

df2 = df.apply(lambda row: np.random.rand(nCols), axis=1)

for start, stop in zip(np.arange(0, nRows , int(round(nRows/float(numberOfChunks)))), 
                       np.arange(int(round(nRows/float(numberOfChunks))), nRows +  int(round(nRows/float(numberOfChunks))), int(round(nRows/float(numberOfChunks))))):
    df2tmp = df2.iloc[start:stop]
    if start == 0:
        df3 = pd.DataFrame(df2tmp.tolist(), index=df2tmp.index).astype('float16')
        continue
    df3tmp =  pd.DataFrame(df2tmp.tolist(), index=df2tmp.index).astype('float16')
    df3 = pd.concat([df3, df3tmp])

这是对第一个答案评论的回答,涉及内存错误问题。下面的示例使用了给出我的计算机内存错误的数据,以及迄今为止建议的所有方法(第一个答案和第一个答案中的注释),但它与下面的代码一起工作:

import pandas as pd
import numpy as np
import time
np.random.seed(1)

nRows = 25000
nCols = 10000
numberOfChunks = 5

df = pd.DataFrame(index=range(nRows ), columns=range(1))

df2 = df.apply(lambda row: np.random.rand(nCols), axis=1)

for start, stop in zip(np.arange(0, nRows , int(round(nRows/float(numberOfChunks)))), 
                       np.arange(int(round(nRows/float(numberOfChunks))), nRows +  int(round(nRows/float(numberOfChunks))), int(round(nRows/float(numberOfChunks))))):
    df2tmp = df2.iloc[start:stop]
    if start == 0:
        df3 = pd.DataFrame(df2tmp.tolist(), index=df2tmp.index).astype('float16')
        continue
    df3tmp =  pd.DataFrame(df2tmp.tolist(), index=df2tmp.index).astype('float16')
    df3 = pd.concat([df3, df3tmp])

在实际数据上应用上述内容时,当运行对应于wantedDF3=pd.concat(df3.apply(pd.DataFrame,columns=['col1','col2']).tolist()的行时,我会得到“内存错误”。关于如何轻松避免这个问题,有什么建议吗?需要检查多个方面。机器的真实数据和RAM的大小。并发布完整的错误堆栈跟踪。是否有一种方法可以在不创建列表的情况下创建DF3?从另一篇文章中可以看出,在这种情况下,列表是导致内存错误的原因。在另一篇文章中,列表类型被建议为问题源,下面是OK,但您的
df
也将
list
放在首位。这也可能是内存错误的原因。@Parth:你的建议行得通。然而,不幸的是,在我的情况下,这似乎是非常缓慢的。我有25000行和15000列。当对我的实际数据应用上述内容时,当运行与wantedDF3=pd.concat(df3.apply(pd.DataFrame,columns=['col1','col2'])对应的行时,我会得到“内存错误”。tolist()。关于如何轻松避免这个问题,有什么建议吗?需要检查多个方面。机器的真实数据和RAM的大小。并发布完整的错误堆栈跟踪。是否有一种方法可以在不创建列表的情况下创建DF3?从另一篇文章中可以看出,在这种情况下,列表是导致内存错误的原因。在另一篇文章中,列表类型被建议为问题源,下面是OK,但您的
df
也将
list
放在首位。这也可能是内存错误的原因。@Parth:你的建议行得通。然而,不幸的是,在我的情况下,这似乎是非常缓慢的。我有25000行和15000列。