首页 > 解决方案 > 有两个数据框,如何创建第三个

问题描述

我有一个数据框 df1

    col1    val1
1   a       2
2   b       3

和 df2(不同的长度)

    col2    val2
1   A       2
2   B       3
3   C       1

我需要第三个看起来像这样的df

    colx    coly    sum
1   a       A       4
2   a       B       5
3   a       C       3
4   b       A       5
5   b       B       3
6   b       C       4

所以 df3 中的行数是df1.shape[0] * df2.shape[0],并且在我对值进行计算的地方添加了第三列(在这种情况下,为了简单起见,它只是求和)。第三个 df 的行一一表示一个值 fromdf1和所有值之间的关系。df2

这是我尝试过的,但我认为这不是一个好方法

cols = [colx, coly, sum]

df3 = pd.DataFrame(columns = cols)

for index, row in df1.iterrows():
    for index2, row2 in df2.iterrows():
        df3.append({'colx': row['col1'], 'coly': row2['col2'], 'sum': row['val1']+row2['val2']}, ignore_index=True)

我真的不知道如何在标题中描述这个,对不起

标签: pythonpandasdataframe

解决方案


使用crossmerge with sum,DataFrame.pop用于求和后删除的列:

df = df1.merge(df2, how='cross')
df['sum'] = df.pop('val1') + df.pop('val2')
print (df)
  col1 col2  sum
0    a    A    4
1    a    B    5
2    a    C    3
3    b    A    5
4    b    B    6
5    b    C    4

或者可以创建Series,然后MultiIndex.from_product使用Series.reindex

s1 = df1.set_index('col1')['val1']
s2 = df2.set_index('col2')['val2']

mux = pd.MultiIndex.from_product([s1.index, s2.index])

df = (s1.reindex(mux, level=0) + s2.reindex(mux, level=1)).reset_index(name='sum')
print (df)
  col1 col2  sum
0    a    A    4
1    a    B    5
2    a    C    3
3    b    A    5
4    b    B    6
5    b    C    4

推荐阅读