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倍,只有少数几行的名称太长,所以性能并不重要。
答
我不认为有一个特别好的方式来做到这一点熊猫。 每当DataFrame包含一列列表,并且您想要执行某种需要迭代列表的计算时,您不得不为列中的每个项目(即列表)调用一次Python函数。由于没有办法在这里应用Pandas的快速矢量化操作,这会伤害性能。如果可能,故事的寓意是避免将列表放入DataFrame中。
(当然,你的情况,似乎要在特定的 格式的另一个应用程序准备CSV。因此,如果需要列出一个数据帧,所以 它。)
正如你上面提到的,你可以遍历行。您可以使用iterrows
或itertuples
。我会用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
的itertuples
for-loop
内部,一个新的数据帧构成的每一行。 DataFrames被收集到名为result
的列表中。在完成for-loop
后,DataFrames列表被连接成一个DataFrame。
你试过迭代通过'df_copy = df.copy()'而不是原始数据帧'df'吗? – Kris
你的意思是复制原来的,然后迭代和追加?听起来不错,我会尝试。 –
此外,如果您可以“包装”Rn值,那么您是否有理由不在每一行上放置单个值? – Kris