有几个问题和我的答案类似,但都用了pd.concat
,而我想用merge
或其他可以给出类似结果的东西.
我想将多个CSV文件合并到一个主DF中.我的所有CSV文件都有两个相同的列("gene"和"log2foldchange").
我的CSV文件都类似于以下内容:
gene | log2foldchange |
---|---|
gene1 | 0.03 |
gene2 | 0.02 |
gene3 | 0.01 |
gene4 | 0.05 |
每个CSV文件:
- 有4个完全相同的基因和列名
- 有一个不同的名字(显然)
我想将CSV文件的名称合并为存储log2foldchange值的列名,这样我就知道数据来自哪里.我希望我的最终主df看起来如下所示:
left | name_of_1st_CSV_file | name_of_2nd_CSV_file | name_of_3rd_CSV_file | name_of_4th_CSV_file |
---|---|---|---|---|
gene1 | 0.08 | 0.09 | 0.07 | 0.01 |
gene2 | 0.07 | 0.03 | 0.06 | 0.001 |
gene3 | 0.08 | 0.06 | 0.05 | 0.2 |
gene4 | 0.09 | 0.02 | 0.03 | 0.011 |
我能够成功地使用pd.concat
将我的所有CSV文件合并到一个主DF中,然而,我最终的DF的 struct 是所有CSV文件只是堆叠在另一个文件的顶部.这种 struct 对我试图进行的分析类型没有意义.我想使用merge
,但我遇到的问题是它需要two个对象,我不确定如何绕过它.
此外,我只能将文件名作为它们自己的单独列,而不能像我所希望的那样,作为log2倍更改的列名.
这是我使用pd.conat编写的代码:
source_files = sorted(Path('path/to/my/files').glob('*.csv'))
dataframes = []
for file in source_files:
df = pd.read_csv(file)
df['source'] = file.name
dataframes.append(df)
df_all = pd.concat(dataframes)
display(df_all)
这会产生如下所示的df:
gene | log2foldchange | source |
---|---|---|
gene1 | 0.03 | 1st CSV file |
gene2 | 0.02 | 1st CSV file |
gene3 | 0.01 | 1st CSV file |
gene4 | 0.04 | 1st CSV file |
gene1 | 0.05 | 2nd CSV file |
gene2 | 0.06 | 2nd CSV file |
等等..
这是我使用pd.merge编写的代码,它会导致错误,因为只给出了一个对象:
path = 'path/to/my/files'
all_files = glob.glob(os.path.join(path, "*.csv")) #make list of file paths
#initialize empty data frame
li = []
for filename in all_files:
df = pd.read_csv(filename, index_col=None, header=0)
li.append(df)
frame = pd.merge(li, axis=0, ignore_index=True)
display(frame)