python - Pandas 从 dataframe_b 的所有列中减去 dataframe_a 中的每一列,并将结果写入第三个数据帧
问题描述
我有 dataframe_a 和 dataframe_b 填充了可变数量的列但相同的行数。
我需要从所有 dfa 列中减去 dfb 的每一列,并创建一个包含减去值的新数据框。
现在我正在手动执行此操作:
sub1 = dfa.subtract(dfb[0], axis = 0)
sub2 = dfa.subtract(dfb[1], axis = 0)
sub3 = dfa.subtract(dfb[2], axis = 0)
etc
然后我使用 concat 函数连接所有列:
subbed = pd.concat([sub1, sub2, sub3],axis=1,ignore_index=True)
subbed = pd.concat([dfa, subbed),axis = 1)
这一切似乎都非常低效,让我对编程感到很糟糕,哈哈。您将如何做到这一点而不必手动减去每一列并将结果直接写入新的数据帧?
解决方案
设置
import pandas as pd
import numpy as np
from itertools import product
dfa = pd.DataFrame([[8, 7, 6]], range(5), [*'ABC'])
dfb = pd.DataFrame([[1, 2, 3, 4]], range(5), [*'DEFG'])
熊猫concat
我使用rsub
带有axis=0
参数的运算符方法。 有关更多信息,请参阅此问答
pd.concat({c: dfb.rsub(s, axis=0) for c, s in dfa.items()}, axis=1)
A B C
D E F G D E F G D E F G
0 7 6 5 4 6 5 4 3 5 4 3 2
1 7 6 5 4 6 5 4 3 5 4 3 2
2 7 6 5 4 6 5 4 3 5 4 3 2
3 7 6 5 4 6 5 4 3 5 4 3 2
4 7 6 5 4 6 5 4 3 5 4 3 2
Numpy的广播
你可以玩弄它并了解它是如何工作的
a = dfa.to_numpy()
b = dfb.to_numpy()
c = a[..., None] - b[:, None]
df = pd.DataFrame(dict(zip(
product(dfa, dfb),
c.reshape(5, -1).transpose()
)))
df
A B C
D E F G D E F G D E F G
0 7 6 5 4 6 5 4 3 5 4 3 2
1 7 6 5 4 6 5 4 3 5 4 3 2
2 7 6 5 4 6 5 4 3 5 4 3 2
3 7 6 5 4 6 5 4 3 5 4 3 2
4 7 6 5 4 6 5 4 3 5 4 3 2
推荐阅读
- flutter - 添加 admob 依赖项会使我的应用程序崩溃
- ruby-on-rails - gem 模块方法不能包含到 ActiveRecord::Base
- ios - 使用 Xamarin 表单播放音频失败并出现错误:NRDAudioClient 不是为 iOS 模拟器构建的
- reactjs - “链接”没有导航到指定的路线 - React JS (react-route-dom)
- python - 如何使用python将字符串附加到文件中间的一行?
- r - 通过R中的变量将行重塑为列表
- c# - 将int数组转换为位图
- javascript - 如何使用cheeriojs 访问iframe #document?
- xamarin.forms - Xamarin Forms 自定义控件数据绑定问题
- python - 散景和熊猫 - 绘制从 csv 读取数据的空图