【发布时间】:2019-08-05 07:04:20
【问题描述】:
我有一个初始数据帧 df1:
df1 = pd.DataFrame(np.array([[1, 'B', 'C', 'D', 'E'], [2, 'B', 'C', 'D', 'E'], [3, 'B', 'C', 'D', 'E'], [4, 'B', 'C', 'D', 'E'], [5, 'B', 'C', 'D', 'E']]), columns=['a', 'b', 'c', 'd', 'e'])
a b c d e
0 1 B C D E
1 2 B C D E
2 3 B C D E
3 4 B C D E
4 5 B C D E
然后我根据 df1 列值计算一些新参数,创建一个新的 df2 并在列名“a”上与 df1 合并。
df2 = pd.DataFrame(np.array([[1, 'F', 'G'], [2, 'F', 'G']]), columns=['a', 'f', 'g'])
a f g
0 1 F G
1 2 F G
df1 = pd.merge(df1, df2, how='left', left_on=['a'], right_on = ['a'])
a b c d e f g
0 1 B C D E F G
1 2 B C D E F G
2 3 B C D E NaN NaN
3 4 B C D E NaN NaN
4 5 B C D E NaN NaN
这工作得很好,但是在另一个循环事件中,我创建了一个与 df2 具有相同列的 df3,但在这种情况下合并不起作用,它没有考虑到相同的列已经在 df1 中。
重要说明:这仅用于说明目的,要添加数千个新数据帧,每个循环步骤一个。
df3 = pd.DataFrame(np.array([[3, 'F', 'G']]), columns=['a', 'f', 'g'])
a f g
0 3 F G
df1 = pd.merge(df1, df3, how='left', left_on=['a'], right_on = ['a'])
a b c d e f_x g_x f_y g_y
0 1 B C D E F G NaN NaN
1 2 B C D E F G NaN NaN
2 3 B C D E NaN NaN F G
3 4 B C D E NaN NaN NaN NaN
4 5 B C D E NaN NaN NaN NaN
我只是使用已经存在的列来填补缺失的空白。这种方法会创建新列(f_x, g_x, f_y, g_y)。
附加和联系也不起作用,因为它们重复信息(“a”上的重复行)。
关于如何解决这个问题的任何建议? 最终结果将df1 与df2 合并后,与df3 合并后应为:
a b c d e f g
0 1 B C D E F G
1 2 B C D E F G
2 3 B C D E F G
3 4 B C D E NaN NaN
4 5 B C D E NaN NaN
最终所有的列都会在循环过程中被填充,所以第一个添加的 (df2) 将添加新的列,从 df3 开始只是新的数据来填充所有的 NaN。循环如下所示:
df1 = pd.DataFrame(np.array([[1, 'B', 'C', 'D', 'E'], [2, 'B', 'C', 'D', 'E'], [3, 'B', 'C', 'D', 'E'], [4, 'B', 'C', 'D', 'E'], [5, 'B', 'C', 'D', 'E']]), columns=['a', 'b', 'c', 'd', 'e'])
for num, item in enumerate(df1['a']):
#compute df[num] (based on values on df1)
df1 = pd.merge(df1, df[num], how='left', left_on=['a'], right_on = ['a'])
【问题讨论】:
-
我在编辑后看到了你的新评论。您能否在
merge所有这些数据帧的位置展示您的loop的一部分? -
@Erfan 类似于:
df1 = pd.DataFrame(np.array([[1, 'B', 'C', 'D', 'E'], [2, 'B', 'C', 'D', 'E'], [3, 'B', 'C', 'D', 'E'], [4, 'B', 'C', 'D', 'E'], [5, 'B', 'C', 'D', 'E']]), columns=['a', 'b', 'c', 'd', 'e'])for num, item in enumerate(df1['a'].values): #compute df[num] df1 = pd.merge(df1, df[num], how='left', left_on=['a'], right_on = ['a']) -
请在您的帖子中包含此内容@juanman
标签: python pandas loops dataframe merge