【问题标题】:Pandas integrate over columns per each rowPandas 对每行的列进行整合
【发布时间】:2018-09-25 23:54:56
【问题描述】:

在简化的数据框中:

import pandas as pd 

df1 = pd.DataFrame({'350': [7.898167, 6.912074, 6.049002, 5.000357, 4.072320],
                '351': [8.094912, 7.090584, 6.221289, 5.154516, 4.211746],
                '352': [8.291657, 7.269095, 6.393576, 5.308674, 4.351173],
                '353': [8.421007, 7.374317, 6.496641, 5.403691, 4.439815],
                '354': [8.535562, 7.463452, 6.584512, 5.485725, 4.517310],
                '355': [8.650118, 7.552586, 6.672383, 4.517310, 4.594806]},
                 index=[1, 2, 3, 4, 5])

int_range = df1.columns.astype(float)
a = 0.005
b = 0.837

我想求解一个方程,如下图所示:

I 等于数据框中的值。 x 是 int_range 值,因此在本例中为 350 到 355,dx=1。 ab 是可选常量

我需要为每个每一行

获取一个数据框作为输出

现在我做这样的事情,但我不确定它是否正确:

dict_INT = {}
for index, row in df1.iterrows():

    func = df1.loc[index]*df1.loc[index].index.astype('float')
    x    = df1.loc[index].index.astype('float')

    dict_INT[index] = integrate.trapz(func, x)

df_out = pd.DataFrame(dict_INT, index=['INT']).T

df_fin = df_out/(a*b)

这是我每行得到的最终总和:

1  3.505796e+06
2  3.068796e+06
3  2.700446e+06
4  2.199336e+06
5  1.840992e+06

【问题讨论】:

  • 所以I 实际上不是一个常数,而是I(x)?。如果是这种情况,您可能想要scipy.integrate.cumtrapz
  • 是的,随x变化,当然,我会更新图片,不清楚。
  • 想要的输出是什么样的?
  • 我猜它应该导致一列积分值与之前的行数相同
  • @ALollz,在这种特殊情况下您将如何实现它=

标签: python pandas scipy integrate


【解决方案1】:

我解决了这个问题,首先将数据框转换为 dict,然后按行中的每个项目执行您的方程式,然后使用集合 defaultdict 将这些值写入 dict。我会分解它:

import pandas as pd
from collections import defaultdict

df1 = pd.DataFrame({'350': [7.898167, 6.912074, 6.049002, 5.000357, 4.072320],
                '351': [8.094912, 7.090584, 6.221289, 5.154516, 4.211746],
                '352': [8.291657, 7.269095, 6.393576, 5.308674, 4.351173],
                '353': [8.421007, 7.374317, 6.496641, 5.403691, 4.439815],
                '354': [8.535562, 7.463452, 6.584512, 5.485725, 4.517310],
                '355': [8.650118, 7.552586, 6.672383, 4.517310, 4.594806]},
                index=[1, 2, 3, 4, 5]
                 )

int_range = df1.columns.astype(float)
a = 0.005
b = 0.837
dx = 1
df_dict = df1.to_dict() # convert df to dict for easier operations

integrated_dict = {} # initialize empty dict

d = defaultdict(list) # initialize empty dict of lists for tuples later
integrated_list = []
for k,v in df_dict.items(): # unpack df dict of dicts
    for x,y in v.items(): # unpack dicts by column and index (x is index, y is column)
        integrated_list.append((k, (((float(k)*float(y)*float(dx))/(a*b))))) #store a list of tuples.


for x,y in integrated_list: # create dict with column header as key and new integrated calc as value (currently a tuple)
    d[x].append(y)


d = {k:tuple(v) for k, v in d.items()} # unpack to multiple values

integrated_df = pd.DataFrame.from_dict(d) # to df
integrated_df['Sum'] = integrated_df.iloc[:, :].sum(axis=1)

输出(更新为包括总和):

             350            351            352            353            354  \
0  660539.653524  678928.103226  697410.576822  710302.382557  722004.527599   
1  578070.704898  594694.141935  611402.972521  622015.269056  631317.086738   
2  505890.250896  521785.529032  537763.142652  547984.294624  556969.473835   
3  418189.952210  432314.245161  446512.126165  455795.202628  464025.483871   
4  340576.344086  353243.212903  365976.797133  374493.356033  382109.376344   

         355             Sum
0  733761.502987  4.202947e+06
1  640661.416965  3.678162e+06
2  565996.646356  3.236389e+06
3  383188.781362  2.600026e+06
4  389762.516129  2.206162e+06

【讨论】:

  • 你基本上在这里做一个左黎曼和,如果我扔掉最右边的列并对你的 integrated_df 的列求和,你的值匹配我的“粗略”计算,if 我删除了你的乘法 float(k)。我不确定你为什么要这样做。
  • 是的,这就是我注意到的,如果我去掉 float(k),我的值与你的粗略值相匹配。让我们以第一个值 350 为例 (7.898167)。 I(x) 减少到他定义的 7.898167 的值。 x 在这种情况下计算为 350,因为他说这是列值,而 ab 分别是常数 0.005 和 0.837。基本上,I(x) 计算方程的解(a 值) (x/ab) 计算为常数,dx 计算为 1(常数)。我不明白为什么我猜 x 不会被包括在内。无论如何感谢您的帮助!
  • 如果有人说以前没有发生过这种情况,而且他们经常做数学,那他们就是在撒谎!您的答案更好,您应该对其进行编辑以使其保持可用。我什至不知道您使用的功能,所以我今天学习了,您只是让我检查了四次数学哈哈。保重!
  • 我希望他回复他的答案,我真的认为他的答案更好,因为它更简洁。我的没有利用为这些东西制作的库。是的,对于定积分的最终结果,您只需将一行中的项目相加并将其输出到最后一列中,对不起,我没有包括在内!我会添加它,但我目前在移动设备上。
  • 是的,我重新检查了代码并立即意识到我问的内容没有意义。很酷,但结果仍然有很大不同,因此我不确定...与其保持无知,不如问问 ;-) 再次感谢!
猜你喜欢
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 2015-06-28
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多