python - 有两个数据框,如何创建第三个
问题描述
我有一个数据框 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)
我真的不知道如何在标题中描述这个,对不起
解决方案
使用cross
merge 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
推荐阅读
- php - 在 docker compose 构建 Web 应用程序后不起作用
- c# - 如何使用 Microsoft.Office.Interop.PowerPoint 使用自定义渐变背景填充图表标题?
- isabelle - 基本伊莎贝尔序列极限证明
- optimization - 需要频繁更换模型时如何优化工作流程?
- azure-active-directory - 将 .NETv4.7 应用程序升级到 .NET Core v3 和 Identity Platform
- javascript - 如何将 Firestore 文档中的所有数据显示到 html 元素中
- javascript - MutationObserver 未检测到某个站点上的更改
- java - 如何使用配置了主体传播的目标从 java 后端进行后续 API 调用
- sql - SQL - Using LEAD to skip over rows with a certain condition
- android - room rxjava 多次调用 onNext,即使没有更改数据库