Python的熊猫复制和数据帧

问题描述:

修改某些行,我有一个数据帧像这样Python的熊猫复制和数据帧

Names;  Count; PartNr 
R1, R2,...Rn; n;  1234-5678 
C1, C2;  2;  1234-6789 

名单应导出为CSV文件导入在其他专有软件。该软件在“名称”列中最多可接受100个字符,如果有更多的数据,我应该包装现有的行,复制整个列并添加剩余的名称。所以在名称列中应该有最多100个字符的多行。零件的绝对计数应该只在第一行,所以计数值应该设置为零。

Names;    Count; PartNr 
R1, R2,...Ra;  n;  1234-5678 
Ra+1, Ra+2,...Rb; 0;  1234-5678 
Rb+1, Rb+2,...Rn; 0;  1234-5678 
C1, C2;    2;  1234-6789 

有没有一种很好的方法,直接在熊猫中修改?

我试着遍历行,但我不允许修改我正在迭代的数据框,所以这是行不通的。有更好的解决方案

数据帧长度从10到1000倍,只有少数几行的名称太长,所以性能并不重要。

+0

你试过迭代通过'df_copy = df.copy()'而不是原始数据帧'df'吗? – Kris

+0

你的意思是复制原来的,然后迭代和追加?听起来不错,我会尝试。 –

+1

此外,如果您可以“包装”Rn值,那么您是否有理由不在每一行上放置单个值? – Kris

我不认为有一个特别好的方式来做到这一点熊猫。 每当DataFrame包含一列列表,并且您想要执行某种需要迭代列表的计算时,您不得不为列中的每个项目(即列表)调用一次Python函数。由于没有办法在这里应用Pandas的快速矢量化操作,这会伤害性能。如果可能,故事的寓意是避免将列表放入DataFrame中。

(当然,你的情况,似乎要在特定的 格式的另一个应用程序准备CSV。因此,如果需要列出一个数据帧,所以 它。)

正如你上面提到的,你可以遍历行。您可以使用iterrowsitertuples。我会用itertuples,因为它往往是更快:

import itertools as IT 
import numpy as np 
import pandas as pd 

Rs = ['R{}'.format(i) for i in range(1,251)] 
Cs = ['C1', 'C2'] 
df = pd.DataFrame({'Names': [Rs, Cs], 'Count': ['n',0], 
        'PartNr':['1234-5678','1234-6789']}) 

def chunks(seq, n): 
    # http://*.com/a/312464/190597 (Ned Batchelder) 
    """ Yield successive n-sized chunks from seq.""" 
    for i in range(0, len(seq), n): 
     yield seq[i:i + n] 

result = [] 
for row in df.itertuples(): 
    result.append(pd.DataFrame({'Names': list(chunks(row.Names, 100)), 
          'Count':row.Count, 
          'PartNr':row.PartNr})) 

result = pd.concat(result, axis=0, ignore_index=True) 
print(result) 

产生

Count            Names  PartNr 
0  n [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11,... 1234-5678 
1  n [R101, R102, R103, R104, R105, R106, R107, R10... 1234-5678 
2  n [R201, R202, R203, R204, R205, R206, R207, R20... 1234-5678 
3  0           [C1, C2] 1234-6789 

itertuplesfor-loop内部,一个新的数据帧构成的每一行。 DataFrames被收集到名为result的列表中。在完成for-loop 后,DataFrames列表被连接成一个DataFrame。