Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何附加多个CSV文件并创建多索引数据帧_Python_Pandas_Append - Fatal编程技术网

Python 如何附加多个CSV文件并创建多索引数据帧

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

我在一个文件夹中有多个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和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 name
f

连接所有数据集时,可以设置
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,如果这不符合你的要求,那么请随意忽略。