Python 如何附加多个CSV文件并创建多索引数据帧
我在一个文件夹中有多个csv文件。目标是将csv文件附加到单个pd帧中 问题是我们如何使用pandas连接文件夹中的所有文件,但同时使用keys参数将特定键与切碎的数据帧的每个片段相关联:Python 如何附加多个CSV文件并创建多索引数据帧,python,pandas,append,Python,Pandas,Append,我在一个文件夹中有多个csv文件。目标是将csv文件附加到单个pd帧中 问题是我们如何使用pandas连接文件夹中的所有文件,但同时使用keys参数将特定键与切碎的数据帧的每个片段相关联:keys 这意味着我们现在可以按键选择每个块: 比如说,, 给定文件夹中的两个csv文件,每个csv都有3列(a、B、C)和两行 CSV文件:Book1 A0 B0 C0 A1 B1 C1 及 CSV文件:Book2 A2 B2 C2 A3 B3 C3 预期的帧如图所示 请注意左侧列上的索引Book1和Boo
keys
这意味着我们现在可以按键选择每个块:
比如说,,
给定文件夹中的两个csv文件,每个csv都有3列(a、B、C)和两行
CSV文件:Book1
A0 B0 C0
A1 B1 C1
及
CSV文件:Book2
A2 B2 C2
A3 B3 C3
预期的帧如图所示
请注意左侧列上的索引Book1和Book2。此名称来自所述csv文件
到目前为止,我有以下代码
# match the pattern ‘csv’ in the folder
extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]
但是,在下面的代码行中,我需要在哪里进行更改以实现上述目标
combined_csv = pd.concat([pd.read_csv(f) for f in all_filenames ])
添加此密钥的原因是为了在将来方便访问。这通常可以通过以下方式实现:
.loc['Book1']
您可以为每个文件创建一个数据框,然后添加该文件来自哪个图书,然后将其附加到组合的_csv数据框中
books = ['book1' 'book2',...'bookn']
i = 1
combined_csv = pd.DataFrame(columns=['Book', 'A', 'B', 'C'])
for book in books:
data = pd.DataFrame('book{}.csv'.format(i))
data.insert(0, 'Book', 'Book'.format(i))
combined_csv = combined_csv.append(data, ignore_index=True)
i += 1
combined_csv.set_index('Book', inplace=True)
让我知道这是否有帮助?您可以使用
assign
方法向每个数据帧添加额外的列;这可以在读取它们之后和连接之前完成
combined_csv = pd.concat([pd.read_csv(f).assign(name=f) for f in all_filenames ])
这将添加name
列,所有值都等于file namef
连接所有数据集时,可以设置MultiIndex
combined_csv.reset_index(drop=True, inplace=True)
combined_csv.set_index([combined_csv.name, combined_csv.index], inplace=True)
找到下面的代码:
import pandas as pd
dfs=[]
for f in all_filenames:
df=pd.read_csv(f)
df['index_name']=f.split('.')[0]
dfs.append(df)
df_combined = pd.concat(dfs)
df_combined.set_index('index_name', inplace=True)
此后:感谢您的快速响应。但是我更喜欢使用'loc'参数为每个轻松访问创建键索引,而不是创建另一列。如图所示。但我感谢您的时间和建议。请看上面的评论,它解决了您的特殊需求。Hi@SIA,我想知道是否有其他方法可以代替您建议的创建新专栏?我相信您的目标是创建一个
多索引
数据框架。因此,不管怎样,你都需要将第二级索引添加到你的数据框架中,添加一列,然后将其设置为索引,这是我知道的一种方法。嗨,谢谢你的快速回复。但是我更喜欢使用'loc'参数为每个轻松访问创建键索引,而不是创建另一列。如图所示。但是我感谢您的时间和建议使用上述代码,您可以使用.loc函数获取特定索引的数据。对吗?是的,您是对的,使用:df_combined.loc[df_combined['index_name']=='Book1']。感谢您的快速响应,但您的建议没有回答OPSee my edit,如果这不符合你的要求,那么请随意忽略。