将多个csv文件中的字符串沿着x和y轴连接到一个数据报中(Pandas)

pw9qyyiw  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(85)

我有一个文件夹,里面有很多csv文件。它们看起来都很相似,列和行的名称都相同。它们的单元格中都有字符串作为值。我想沿着列和行将它们连接起来,这样所有的字符串都连接到各自的单元格中。

    • 示例:**

file1.csv
| 无|1个|第二章|三个|四个|
| - ------|- ------|- ------|- ------|- ------|
| b1|彼得|房屋|灰分|平面|
| b2|卡尔|马|保罗|刀|
| b3|玛丽|苹果|琳达|胡萝卜|
| b4|绞|汽车|药草|啤酒|
file2.csv
| 无|1个|第二章|三个|四个|
| - ------|- ------|- ------|- ------|- ------|
| b1|标记|绿色|你好|带|
| b2|没有|电话|匙|再见|
| b3|红色|樱桃|查理|锤|
| b4|良好|是的|好的|西蒙|
我想要的结果是字符串值之间没有分隔符:
concatenated.csv
| 无|1个|第二章|三个|四个|
| - ------|- ------|- ------|- ------|- ------|
| b1|彼得马克|室内绿化|阿什哈罗|平面带|
| b2|卡尔诺|马送受话器|保罗斯彭|刀再见|
| b3|玛丽红|苹果樱桃|琳达·查理|胡萝卜锤|
| b4|绞纱|汽车是|药草好|比尔西蒙|
我不知道如何在木星笔记本里的Pandas身上做这个。
我已经尝试了几件事,但所有的要么保持一个单独的一组行或列。

guicsvcw

guicsvcw1#

如果这是您的第一个 Dataframe :

df1_data = {
    1 : ['peter', 'carl', 'mary', 'hank'],
    2 : ['house', 'horse','apple', 'car']
}
df1 = pd.DataFrame(df1_data)
print(df1)

输出:
这是你的第二个 Dataframe

df2_data = {
    1 : ['mark', 'no',   'red',   'good'],
    2 : ['green','phone','cherry','yes' ]
}
df2 = pd.DataFrame(df2_data)
print(df2)

输出:
您可以按如下方式访问所请求的 Dataframe :

df = pd.DataFrame()
df[1] = df1[1] + ' ' +df2[1]
df[2] = df1[2] + ' ' +df2[2]
print(df)

输出:

    • 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
qq24tv8q

qq24tv8q2#

如果性能不是问题,可以将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))
     )

输出:

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
w41d8nur

w41d8nur3#

将多个csv文件读入一个DF是一个很常见的答案,也是你问题的第一部分,你可以找到一个合适的答案here
之后,为了允许您同时对所有文件执行此操作,您可以使用自定义的agg函数进行融化和透视,如下所示:
导入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))

相关问题