![](/img/trans.png)
[英]How to import multiple csv files and concatenate into one DataFrame using pandas
[英]Concatenate strings in multiple csv files into one datafram along x and y axis (in pandas)
我有一个包含许多 csv 个文件的文件夹。 它们看起来都很相似,它们的列和行都具有相同的名称。 它们的单元格中都有字符串作为值。 我想沿着列和行连接它们,以便所有字符串都连接到它们各自的单元格中。
例子:
file1.csv
0 | 1个 | 2个 | 3个 | 4个 |
---|---|---|---|---|
b1 | 彼得 | 屋 | 灰 | 飞机 |
b2 | 卡尔 | 马 | 保罗 | 刀 |
b3 | 玛丽 | 苹果 | 琳达 | 萝卜 |
b4 | 汉克 | 车 | 草本植物 | 啤酒 |
file2.csv
0 | 1个 | 2个 | 3个 | 4个 |
---|---|---|---|---|
b1 | 标记 | 绿色 | 你好 | 乐队 |
b2 | 不 | 电话 | 勺子 | 再见 |
b3 | 红色的 | 樱桃 | 查理 | 锤子 |
b4 | 好的 | 是的 | 行 | 西蒙 |
我想要的是字符串值之间没有分隔符的结果:
concatenated.csv
0 | 1个 | 2个 | 3个 | 4个 |
---|---|---|---|---|
b1 | 彼得马克 | 房子绿色 | 灰 你好 | 平面带 |
b2 | 卡尔不 | 马电话 | 保罗汤匙 | 刀再见 |
b3 | 玛丽红 | 苹果樱桃 | 琳达·查理 | 胡萝卜锤 |
b4 | 谢谢 | 车是的 | 香草还行 | 啤酒西蒙 |
而且我不知道如何在 pandas 中在 jupyter 笔记本中执行此操作。
我已经尝试了几件事,但所有这些都保留了一组单独的行或列。
如果这些是您的数据框:
df1_data = {
1 : ['peter', 'carl', 'mary', 'hank'],
2 : ['house', 'horse','apple', 'car']
}
df1 = pd.DataFrame(df1_data)
df2_data = {
1 : ['mark', 'no', 'red', 'good'],
2 : ['green','phone','cherry','yes' ]
}
df2 = pd.DataFrame(df2_data)
df1:
1 2
0 peter house
1 carl horse
2 mary apple
3 hank car
df2:
1 2
0 mark green
1 no phone
2 red cherry
3 good yes
您可以像这样联系您请求的 dataframe:
df = pd.DataFrame()
df[1] = df1[1] + ' ' + df2[1]
df[2] = df1[2] + ' ' + df2[2]
print(df)
Output:
1 2
0 peter mark house green
1 carl no horse phone
2 mary red apple cherry
3 hank good car yes
循环 csv 个文件:
现在,如果你有很多 csv 文件,名称如file1.csv
和file2.csv
等等,你可以将它们全部保存在d
中,如下所示:
d = {}
for i in range(1,#N):
d[i] = pd.read_csv('.../file'+str(i)+'.csv')
#N is the number of csv files. (because I started from 1, you have to add 1 to N)
并像这样构建您想要的 dataframe:
concatenated_df = pd.DataFrame()
for i in range(1,#N):
concatenated_df[i] = d[1].iloc[:,i] + ' ' + d[2].iloc[:,i] + ...
#N is the number of columns here.
如果性能不是问题,您可以使用pandas.DataFrame.applymap
和pandas.Series.add
:
out = df1[[0]].join(df1.iloc[:, 1:].applymap(lambda v: f"{v} ").add(df2.iloc[:, 1:]))
或者,对于大型数据集,您可以将pandas.concat
与listcomp一起使用:
out = (
df1[[0]]
.join(pd.concat([df1.merge(df2, on=0)
.filter(regex=f"{p}_\w").agg(" ".join, axis=1)
.rename(idx) for idx, p in enumerate(range(1, len(df1.columns)), start=1)],
axis=1))
)
Output:
print(out)
0 1 2 3 4
0 b1 peter mark house green ash hello plane band
1 b2 carl no horse phone paul spoon knife goodbye
2 b3 mary red apple cherry linda charly carrot hammer
3 b4 hank good car yes herb ok beer simon
将许多 csv 个文件读入单个 DF 是一个很常见的答案,并且是您问题的第一部分。 您可以在这里找到合适的答案。
之后,为了让您同时对所有文件执行此操作,您可以使用自定义 agg function melt 和 pivot,如下所示:
导入 glob 导入 pandas 作为 pd
# See the linked answer if you need help finding csv files in a different directory
all_files = glob.glob('*.csv'))
df = pd.concat((pd.read_csv(f) for f in all_files))
output = df.melt(id_vars='0')
.pivot_table(index='0',
columns='variable',
values='value',
aggfunc=lambda x: ' '.join(x))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.