python2.7合并两个CSV文件,在第一个fi中不带头和两个分隔符

2024-04-25 01:54:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv test1.csv(我没有标题!!!)。正如你所看到的那样,我还有一个分隔符,它带有管道,但在八列之后正好有一个制表符。你知道吗

ug|s|b|city|bg|1|94|ON-05-0216  9.72|28|288
ug|s|b|city|bg|1|94|ON-05-0217  9.72|28|288

我有第二个文件test2.csv,只有分隔符管道

ON-05-0216|100|50
ON-05-0180|244|152
ON-05-0219|269|146

因此,因为只有一个值(ON-05-0216)与第一个文件的八列和第二个文件的第一列匹配,这意味着我在输出文件中应该只有一个值,但是与第二个文件的第二列和第三列的SUM列相加(100+50)。你知道吗

最终结果如下:

ug|s|b|city|bg|1|94|ON-05-0216  Total=150|9.72|28|288

或者

ug|s|b|city|bg|1|94|ON-05-0216|Total=150    9.72|28|288

什么都容易。你知道吗

我认为最好的方法是和熊猫一起使用。但我坚持从第一个文件中获取多个分隔符,以及如何匹配没有列名的列,因此不确定如何继续。你知道吗

import pandas as pd

a = pd.read_csv("test1.csv", header=None)
b = pd.read_csv("test2.csv", header=None)
merged = a.merge(b,)
merged.to_csv("output.csv", index=False)

先谢谢你


Tags: 文件csvnonecityread管道ontotal
2条回答

用途:

# Reading files
df1 = pd.read_csv('file1.csv', header=None, sep='|')
df2 = pd.read_csv('file2.csv', header=None, sep='|')

# splitting file on tab and concatenating with rest 
ndf = pd.concat([df1.iloc[:,:7], df1[7].str.split('\t', expand=True), df1.iloc[:,8:]], axis=1)
ndf.columns = np.arange(11)

# adding values from df2 and bringing in format Total=sum
df2.columns = ['c1', 'c2', 'c3']
tot = df2.eval('c2+c3').apply(lambda x: 'Total='+str(x))

# Finding which rows needs to be retained
idx_1 = ndf.iloc[:,7].str.split('-',expand=True).iloc[:,2]
idx_2 = df2.c1.str.split('-',expand=True).iloc[:,2]
idx = idx_1.isin(idx_2)      # Updated
ndf = ndf[idx].reset_index(drop=True)
tot = tot[idx].reset_index(drop=True)

# concatenating both CSV together and writing output csv
ndf.iloc[:,7] = ndf.iloc[:,7].map(str) + chr(9) + tot
pd.concat([ndf.iloc[:,:8],ndf.iloc[:,8:]], axis=1).to_csv('out.csv', sep='|', header=None, index=None)

# OUTPUT
# ug|s|b|city|bg|1|94|ON-05-0216    Total=150|9.72|28|288

在读取csvpd.read_csv(... sep='|')时,可以将管道用作delimeter,并且稍后仅在此处使用此example拆分制表符分隔的列。你知道吗

合并两个数据帧时,必须有一个公共列用于合并。在对不同的数据帧进行必要的计算之后,可以将它们用作索引,以便更容易地追加。你知道吗

相关问题 更多 >