Pandas 熊猫每行应用多个列,而不是列表
在使用apply时,我很难让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]]
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列。