将Merce csv文件(来自文件夹)合并到一个文件夹中,使用Python添加具有不同名称的列

2024-04-19 21:32:45 发布

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

我需要合并到一个文件夹中的几个CSV文件到一个单一的位置。你知道吗

我的原始数据是这样的

y\u 1980.csv:

     country   y_1980
0        afg    196
1        ago    125
2        alb     23
3          .      .
.          .      .

yu 1981.csv:

     country   y_1981
0        afg    192
1        ago    120
2        alb     0
3          .      .
.          .      .

20岁xx.csv文件:

     country   y_20xx
0        afg    176
1        ago    170
2        alb     76
3          .      .
.          .      .

我希望得到类似的结果:

     country   y_1980   y_1981   ...   y_20xx    
0        afg      196      192   ...      176
1        ago      125      120   ...      170
2        alb       23        0   ...       76
3          .        .        .   ...        .
.          .        .        .   ...        .

到目前为止,我的当前代码如下所示,但我得到的结果是数据帧在前一帧之后合并:

interesting_files = glob.glob("/Users/Desktop/Data/*.csv") 

header_saved = True

with open('/Users/Desktop/Data/table.csv','wb') as fout:
    for filename in interesting_files:

        with open(filename) as fin:
            header = next(fin)
            if not header_saved:
                fout.write(header)
                header_saved = True
            for line in fin:
                fout.write(line)

Tags: 文件csvfilesagocountryusersglobheader
3条回答

熊猫让这很容易。通过循环和合并,您只需执行以下操作:

代码:

import pandas as pd

files = ['file1', 'file2']
dfs = None
for filename in files:
    df = pd.read_csv(filename, sep='\s+')
    if dfs is None:
        dfs = df
    else:
        dfs = dfs.merge(df, how='outer')
    print(df)
print(dfs)
dfs.to_csv('file3', sep=' ')

结果:

  country  y_1980
0     afg     196
1     ago     125
2     alb      23

  country  y_1981
0     afg     192
1     ago     120
2     alb       0

  country  y_1980  y_1981
0     afg     196     192
1     ago     125     120
2     alb      23       0

如果你用熊猫会容易得多。原因是它将摆脱for-loop问题并保持memory footprint低。你知道吗

import pandas as pd

# read the files first

y_1980 = pd.read_csv('y_1980.csv', sep='\t')
y_1981 = pd.read_csv('y_1981.csv', sep='\t')

如果值之间用逗号“”或“”分隔,则可以更改sep选项。你知道吗

# set 'country' as the index to use this value to merge.
y_1980 = y_1980.set_index('country', append=True)
y_1981 = y_1981.set_index('country', append=True)

print(y_1980)
print(y_1981)

            y_1980
    country        
  0 afg         196
  1 ago         125
  2 alb          23


             y_1980
    country        
  0 afg         192
  1 ago         120
  2 alb           0

# set the frames to merge. You can add as many dataframe as you want.
frames =[y_1980, y_1981]

# now merge the dataframe
merged_df = pd.concat(frames, axis=1).reset_index(level=['country'])
print(result)

      country  y_1980  y_1980
0     afg     196     192
1     ago     125     120
2     alb      23       0

附加说明:如果只想合并所有帧中存在的键,可以添加选项:how='inner' and drop=na。如果要合并所有帧中所有可能的数据,请使用how='outer'。你知道吗

有关详细信息,请参见此链接:http://pandas.pydata.org/pandas-docs/stable/merging.html

代码的顺序如下:

  • 打开文件#1
  • 未保存时写入标题
  • 写入数据行
  • 打开文件#2
  • …等等

它将所有数据连接到一个文件中。听起来你真的想加入“国家”这个栏目

import glob
import pandas as pd
csvs = glob.glob("*.csv")
dfs = []

for csv in csvs:
  dfs.append(pd.read_csv(csv))

merged_df = dfs[0]

for df in dfs[1:]:
  merged_df = pd.merge(merged_df,df,on=['country'])


merged_df.to_csv('out.csv',index=False)

相关问题 更多 >