Python 基于其他两个数据帧填充新数据帧

Python 基于其他两个数据帧填充新数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我想要一个有效的方法来解决下面这个问题,因为我的代码看起来效率很低 首先,让我提供一个虚拟数据集 import numpy as np import pandas as pd from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all" df1= {'a0' : [1,2,2,1,3], 'a1' : [2,3,3,2,4], 'a2'

我想要一个有效的方法来解决下面这个问题,因为我的代码看起来效率很低

首先,让我提供一个虚拟数据集

import numpy as np
import pandas as pd    
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

df1= {'a0' : [1,2,2,1,3], 'a1' : [2,3,3,2,4], 'a2' : [3,4,4,3,5], 'a3' : [4,5,5,4,6], 'a4' : [5,6,6,5,7]}

df2 = {'b0' : [3,6,6,3,8], 'b1' : [6,8,8,6,9], 'b2' : [8,9,9,8,7], 'b3' : [9,7,7,9,2], 'b4' : [7,2,2,7,1]}

df1 = pd.DataFrame(df1)

df2 = pd.DataFrame(df2)
我的实际数据集有超过100000行和15列。 现在,我想做的是非常复杂的解释,但现在我们开始

目标:我想使用上面的两个df创建一个新的df

1从df1中查找全局最小值和最大值。由于该值是按行排序的,因此列“a”将始终具有每行的最小值,“e”将具有最大值。因此,我将在“a0”列中找到最小值,在“a4”列中找到最大值

Min = df1['a0'].min()
Max = df1['a4'].max()

Min
Max
2然后我将创建一个数据帧,其中填充0和rangeMin,Max列。在本例中,是1到7

column = []
for i in np.arange(Min, Max+1):
    column.append(i)

newdf = pd.DataFrame(0, index = df1.index, columns=column)
3第三步是找到df2中的值的位置:

我想循环使用df1中的每个值。并将每个值与同一行中新df中的列名匹配

例如,如果我们查看第0行并遍历每一列;本例中的值为[1,2,3,4,5]。然后,newdf的第0行第1、2、3、4、5列将用df2中的相应值填充

4最后,df2中相同位置的每个对应值将添加到我们在步骤2中找到的位置

因此,新df的第一行将如下所示:

output = {'1' : [3], '2' : [6], '3' : [8], '4' : [9], '5' : [7], '6' : [0], '7' : [0]}

output = pd.DataFrame(output)
第6列和第7列将不会更新,因为df1的第一行中没有第6列和第7列

以下是我在此过程中的代码:

for rowidx in range(0, len(df1)):
    for columnidx in range(0,len(df1.columns)):
        new_column = df1[str(df1.columns[columnidx])][rowidx] 
        newdf.loc[newdf.index[rowidx], new_column] = df2['b' + df1.columns[columnidx][1:]][rowidx]
我认为这可以完成任务,但正如我所说的,我的实际数据集非常庞大,有299999行,最小到最大的范围是282,这意味着新数据框中有282列

因此,上面的代码将永远运行。如果有更快的方法可以做到这一点。请帮帮我。我想我学到了一些东西,比如地图,减少??但我不知道这是否适用于这里,也不知道是否有其他的方法


谢谢。

想法是在两个数据帧中创建默认列名称,然后在ed系列中,将前0列添加到索引中,删除第二级,以便可能使用:

其他解决方案:

comp =[pd.Series(a, index=df1.loc[i]) for i, a in enumerate(df2.values)]
df = pd.concat(comp, axis=1).T.fillna(0).astype(int)
print (df)
   1  2  3  4  5  6  7
0  3  6  8  9  7  0  0
1  0  6  8  9  7  2  0
2  0  6  8  9  7  2  0
3  3  6  8  9  7  0  0
4  0  0  8  9  7  2  1
或:


几秒钟后,这给了我一个记忆错误:@YunTaeHwang-你的内存有多大?我的内存是16GB谢谢,我正在试整个内存set@YunTaeHwang-还添加了另一个解决方案。
comp =[pd.Series(a, index=df1.loc[i]) for i, a in enumerate(df2.values)]
df = pd.concat(comp, axis=1).T.fillna(0).astype(int)
print (df)
   1  2  3  4  5  6  7
0  3  6  8  9  7  0  0
1  0  6  8  9  7  2  0
2  0  6  8  9  7  2  0
3  3  6  8  9  7  0  0
4  0  0  8  9  7  2  1
comp = [dict(zip(x, y)) for x, y in zip(df1.values, df2.values)]
c = pd.DataFrame(comp).fillna(0).astype(int)
print (c)
   1  2  3  4  5  6  7
0  3  6  8  9  7  0  0
1  0  6  8  9  7  2  0
2  0  6  8  9  7  2  0
3  3  6  8  9  7  0  0
4  0  0  8  9  7  2  1