我有一个包含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和这种编程。我很确定我没有使用我的比赛场地的能力。
你能分享一些想法吗? :)提前致谢!