有几个问题和我的答案类似,但都用了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)

推荐答案

EDITED: Tweaked in response to comments

这能行得通吗?

from functools import reduce

list_of_dfs = []

for file in all_files:
    df = pd.read_csv(file, header=0, sep=",") #Change sep to whatever separates your data
    df = df.loc[:, ['gene', 'log2foldchange']] #Subset out only the two columns you want
    file_name = os.path.splitext(os.path.basename(file))[0] #Get filename without extension
    df = df.rename(columns={'log2foldchange': file_name}) #Rename log2fold column with file name
    list_of_dfs.append(df) #Add df to list of dfs

df_merged = reduce(lambda left,right: pd.merge(left,right,on='gene',how='outer'), list_of_dfs)

Python相关问答推荐

使用decorator 自动继承父类

Python中的锁定类和线程以实现dict移动

使用Python进行网页抓取,没有页面

Docker-compose:为不同项目创建相同的容器

如何在Python中增量更新DF

模型序列化器中未调用现场验证器

如何处理嵌套的SON?

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

从收件箱中的列中删除html格式

Pandas - groupby字符串字段并按时间范围 Select

使用@ guardlasses. guardlass和注释的Python继承

如何在Python脚本中附加一个Google tab(已经打开)

将9个3x3矩阵按特定顺序排列成9x9矩阵

在含噪声的3D点网格中识别4连通点模式

Django RawSQL注释字段

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

旋转多边形而不改变内部空间关系

python中csv. Dictreader. fieldname的类型是什么?'

OpenCV轮廓.很难找到给定图像的所需轮廓