Python 熊猫计算优化?

Python 熊猫计算优化?,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个1700万行的CSV文件。这是SAP的MSEG表。 在这些行中,有像EBELN、EBELP、DMBTR这样的数据列。我要做的是求所有行的DMBTR之和,其中EBELN和EBELP是相同的 我就是这么做的: import pandas as pd mseg_table = ['MANDT', 'MBLNR', 'MJAHR', 'DMBTR', 'ERFMG', 'ERFME', 'EBELN', 'EBELP', 'LFBJA', 'LFBNR', 'SGTXT', 'WEMPF'] m

我有一个1700万行的CSV文件。这是SAP的MSEG表。 在这些行中,有像EBELN、EBELP、DMBTR这样的数据列。我要做的是求所有行的DMBTR之和,其中EBELN和EBELP是相同的

我就是这么做的:

import pandas as pd
mseg_table = ['MANDT', 'MBLNR', 'MJAHR', 'DMBTR', 'ERFMG', 'ERFME', 'EBELN', 'EBELP', 'LFBJA', 'LFBNR', 'SGTXT', 'WEMPF']
mseg = pd.read_table('c:/3wayvisual/MSEG.CSV', sep=';', header=None, dtype=str, names=mseg_table)
mseg.drop(['MANDT', 'MBLNR', 'MJAHR', 'ERFME', 'ERFMG', 'LFBJA', 'SGTXT', 'LFBNR', 'WEMPF'], axis=1, inplace=True)
seg['DMBTR'] = mseg['DMBTR'].astype(float)
mseg = mseg.dropna(subset=['EBELN'])
这使我的数据帧清除了所有“不重要”的数据。以下是数据帧中的EBELN编号示例:

print(mseg.loc[mseg['EBELN'] == '0025284220'])

        DMBTR       EBELN  EBELP
4600   628.51  0025284220  00010
4611   624.94  0025284220  00010
4617  1251.67  0025284220  00010
4625   623.16  0025284220  00010
4644  1543.56  0025284220  00020
4655  2320.83  0025284220  00020
4661  1543.56  0025284220  00020
4666   768.11  0025284220  00020
4671   765.36  0025284220  00020
4685   672.84  0025284220  00030
4693   673.70  0025284220  00030
4703   669.44  0025284220  00030
4737  1350.80  0025284220  00030
4745  1349.09  0025284220  00030
4746   672.84  0025284220  00030
4748   673.70  0025284220  00030
现在坏的部分开始了,我得到了EBELN和EBELP的唯一出现次数

ebeln_unique = mseg.EBELN.unique()
ebelp_unique = mseg.EBELP.unique()
之后,我为每个EBELN和EBELP组合创建一个子数据帧列表

mseg_teil = []
ebeln_index=0
for x in ebeln_unique:
    ebelp_index=0
    for y in ebelp_unique:
        if len(mseg[(mseg['EBELN'] == ebeln_unique[ebeln_index]) & (mseg['EBELP'] == ebelp_unique[ebelp_index])]) != 0:
            mseg_teil.append(mseg[(mseg['EBELN'] == ebeln_unique[ebeln_index]) & (mseg['EBELP'] == ebelp_unique[ebelp_index])])
            ebelp_index = ebelp_index + 1
        else:
            ebelp_index = ebelp_index + 1
    ebeln_index = ebeln_index + 1
现在我浏览这个列表,对每个数据帧的DMBTR求和,并向新的数据帧添加一个新行

mseg_teil_index = 0
mseg_summiert = pd.DataFrame() 
for z in mseg_teil:
    mseg_pop = []
    EBELN = 0
    EBELP = 0
    DMBTR = 0
    mseg_pop = mseg_teil[mseg_teil_index]
    DMBTR = mseg_pop.DMBTR.sum()
    EBELN = mseg_pop.EBELN[0]
    EBELP = mseg_pop.EBELP[0]
    '''zeile_summiert = pd.DataFrame({'DMBTR': [DMBTR], 'EBELN': [EBELN], 'EBELP': [EBELP]})'''
    mseg_summiert = mseg_summiert.append({'DMBTR': DMBTR, 'EBELN': EBELN, 'EBELP': EBELP}, ignore_index = True)
    mseg_teil_index = mseg_teil_index + 1
这是工作良好,但它需要大量的时间和内存的机器。该操作将在将来某个时间在服务器上进行,但MSEG数据帧将有大约10列

这是我当前示例数据的结果:

    DMBTR       EBELN       EBELP
0   21771.54    0029784218  00010
1   347.00      0029783465  00050
2   2839.00     0029783464  00060
3   458.80      0029784290  00010
4   35266.56    0029779778  00010
5   10241.36    0029783913  00010
6   10413.14    0029783912  00010
7   10208.64    0029783912  00020
下面是上面显示的处于“新”状态的EBELN:

我对python、pandas和这类编程不是很熟练。我很确定我没有利用我的比赛场地的能力

你能分享一些想法吗?:)


提前谢谢

请将输入、输出、中间结果等作为文本而不是图像发布。这是非常没有帮助的。也许已经晚了,但我不能确切地理解您想要实现什么。您好,我试图实现的是,我有一个数据帧,其中EBELN和EBELP的每一个组合都只是一行,而不是几行。我对上面的示例进行了编辑,以提供一个清晰的示例。如果您提供一个自包含的示例,最好使用toy example dataframes。但是现在我认为您只需要类似于
df.groupby('EBELN','EBELP')['DMBTR'].sum()
print(mseg_summiert.loc[mseg_summiert['EBELN'] == '0025284220'])

      DMBTR       EBELN  EBELP
8   3128.28  0025284220  00010
9   6941.42  0025284220  00020
10  6062.41  0025284220  00030