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