Python 熊猫计算优化?
我有一个1700万行的CSV文件。这是SAP的MSEG表。 在这些行中,有像EBELN、EBELP、DMBTR这样的数据列。我要做的是求所有行的DMBTR之和,其中EBELN和EBELP是相同的 我就是这么做的: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
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