繁体   English   中英

将多个 csv 文件中的字符串沿 x 和 y 轴连接成一个数据帧(在 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.csvfile2.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.applymappandas.Series.add

out = df1[[0]].join(df1.iloc[:, 1:].applymap(lambda v: f"{v} ").add(df2.iloc[:, 1:]))

或者,对于大型数据集,您可以将pandas.concatlistcomp一起使用:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM