我有以下模式中具有相同列数(不同行数)的100个csv文件:
档案1:
A1,B1,C1
A2,B2,C2
A3,B3,C3
A4,B4,C4
文件2:
*A1*,*B1*,*C1*
*A2*,*B2*,*C2*
*A3*,*B3*,*C3*
档案......
输出:
A1+*A1*+...,B1+*B1*+...,C1+*C1*+...
A2+*A2*+...,B2+*B2*+...,C2+*C2*+...
A3+*A3*+...,B3+*B3*+...,C3+*C3*+...
A4+... ,B4+... ,C4+...
例如:
档案1:
1,0,0
1,0,1
1,0,0
0,1,0
档案2:
1,1,0
1,1,1
0,1,0
输出:
2,1,0
2,1,2
1,1,0
0,1,0
我真的很想知道如何解决这个问题......任何机构都可以给我一些建议吗?
非常感谢和最诚挚的问候,朱利安
编辑:我非常感谢'pepr'非常详细的答案,但我想找到一个使用pandas的解决方案,如'furas'所示 . 我找到了一种为我的所有文件创建变量的方法,如下所示:
dic={}
for i in range(14253,14352):
try:
dic['df_{0}'.format(i)]=pandas.read_csv('output_'+str(i)+'.csv')
except:
pass
但如果我尝试建议
df1['column_A'] += df2['column_*A*']
因为在我的情况下我有100个文件,它必须是类似的
for residue in residues:
for number in range(14254,14255):
df=dic['df_14253'][residue]
df+=dic['df_'+str(number)][residue]
我有一个问题,我的文件有不同的行数,只是总结到df1的最后一行 . 我该怎么解决这个问题?我认为panda的groupby.sum可能是一个选项,但我不明白如何使用它 .
PS:残基是包含所有列 Headers 的列表 .
2 回答
标准模块的解决方案可以是这样的:
itertools
实现zip_longest()
,类似于内置的zip()
;但是,它可以处理不同长度的序列 . 这里第三个参数fillvalue
是一个快速黑客 - 3列硬连线 . 实际上,它可以设置为[0, 0, 0]
(即整数而不是字符串),因为int(0)
也是零 .每个
zip_longest()
提取两行元组 - 元素分配给row1
和row2
. 在循环内部,可以使用正常的zip()
,因为您将始终拥有文件中的行或带有零的fillvalue
. 你总是得到第一行的一个元素和第二行的第二个元素 . 它们必须从string转换为int,然后在row_out
中添加它们以形成单个元素 .循环的更好解决方案(不依赖于固定数量的列)使用默认
None
作为fillvalue
. 如果其中一行是None
,则将其设置为具有与另一行相同数量的零的列表 . 这意味着你甚至可以在同一个文件中拥有不同长度的行(但两个文件必须相同;相反也可以使用zip_longest()
在循环体中轻松解决 .使用pandas .
它可以读取CSV文件,它可以添加两列 .