熊猫计算优化?

时间:2017-02-24 11:18:47

标签: 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']
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'])

这使Dataframe清除了所有“不重要”的数据。以下是DataFrame中的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-Kombination创建一个子数据框列表。

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

现在我浏览此列表,对每个DataFrame的DMBTR求和,并向新的Dataframe添加新行。

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:

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

我不太熟悉python,pandas和这种编程。我很确定我没有使用我的比赛场地的能力。

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

提前致谢!

0 个答案:

没有答案