Python 从几十个df.sum()系列中创建一个新的数据帧

Python 从几十个df.sum()系列中创建一个新的数据帧,python,pandas,dataframe,series,Python,Pandas,Dataframe,Series,我有几个相同格式的数据帧,有五列 我想使用df.sum()对每个数据帧的值求和。这将为每个数据帧创建一个系列,仍然有5列 我的问题是如何获取这些序列并创建另一个数据帧,一列是文件名,另一列是df.sum()中的五列 不幸的是,这种方法行不通df['filename']=str(filename)'抛出一个类型错误,并且创建新的数据帧newdf无法正确解析 如何正确地做到这一点 如何获取多个pandas.Series对象并创建DataFrame 要回答这个具体问题: @ThomasTu我如何从以“

我有几个相同格式的数据帧,有五列

我想使用
df.sum()
对每个数据帧的值求和。这将为每个数据帧创建一个系列,仍然有5列

我的问题是如何获取这些序列并创建另一个数据帧,一列是文件名,另一列是
df.sum()中的五列

不幸的是,这种方法行不通df['filename']=str(filename)'抛出一个类型错误,并且创建新的数据帧
newdf
无法正确解析

如何正确地做到这一点


如何获取多个
pandas.Series
对象并创建
DataFrame

要回答这个具体问题:


@ThomasTu我如何从以“文件名”为名称的系列列表开始 列到数据帧?我想这就是问题所在——我不明白 这个

它本质上就是您现在所拥有的,但不是附加到空列表,而是附加到空数据帧。如果您不想在每次迭代中重新分配newdf,我认为有一个inplace关键字

import pandas as pd
import glob

batch_of_dataframes =  glob.glob("*.txt")

newdf = pd.DataFrame()
for filename in batch_of_dataframes:
    df = pd.read_csv(filename)
    df['filename'] = str(filename)
    df = df.sum()
    newdf = newdf.append(df, ignore_index=True)

要回答这个具体问题:


@ThomasTu我如何从以“文件名”为名称的系列列表开始 列到数据帧?我想这就是问题所在——我不明白 这个

它本质上就是您现在所拥有的,但不是附加到空列表,而是附加到空数据帧。如果您不想在每次迭代中重新分配newdf,我认为有一个inplace关键字

import pandas as pd
import glob

batch_of_dataframes =  glob.glob("*.txt")

newdf = pd.DataFrame()
for filename in batch_of_dataframes:
    df = pd.read_csv(filename)
    df['filename'] = str(filename)
    df = df.sum()
    newdf = newdf.append(df, ignore_index=True)
请按以下顺序尝试:

  • 创建一个空列表,比如说
    list\u of_series

  • 对于每个文件:

  • 加载到数据帧中,然后将总和保存在序列中
    s

  • 将元素添加到s:
    s['filename']=您的文件名

  • s
    附加到系列的
    列表中

  • 最后,连接(并在需要时转置):

  • 代码 准备:

    l_df = [pd.DataFrame(np.random.rand(3,5), columns = list("ABCDE")) for _ in range(5)]
    for i, df in enumerate(l_df):
        df.to_csv(str(i)+'.txt', index = False)
    
    文件*.txt以逗号分隔,包含标题

    ! cat 1.txt
    A,B,C,D,E
    0.18021800981245173,0.29919271590063656,0.09527248614484807,0.9672038093199938,0.07655003742768962
    0.35422759068109766,0.04184770882952815,0.682902924462214,0.9400817219440063,0.8825581077493059
    0.3762875793116358,0.4745731412494566,0.6545473610147845,0.7479829630649761,0.15641907539706779
    
    事实上,其余部分与您所做的非常相似(我将文件名附加到一个系列中,而不是数据帧中。否则,它们通过
    sum()
    )连接了好几次):

    请按以下顺序尝试:

  • 创建一个空列表,比如说
    list\u of_series

  • 对于每个文件:

  • 加载到数据帧中,然后将总和保存在序列中
    s

  • 将元素添加到s:
    s['filename']=您的文件名

  • s
    附加到系列的
    列表中

  • 最后,连接(并在需要时转置):

  • 代码 准备:

    l_df = [pd.DataFrame(np.random.rand(3,5), columns = list("ABCDE")) for _ in range(5)]
    for i, df in enumerate(l_df):
        df.to_csv(str(i)+'.txt', index = False)
    
    文件*.txt以逗号分隔,包含标题

    ! cat 1.txt
    A,B,C,D,E
    0.18021800981245173,0.29919271590063656,0.09527248614484807,0.9672038093199938,0.07655003742768962
    0.35422759068109766,0.04184770882952815,0.682902924462214,0.9400817219440063,0.8825581077493059
    0.3762875793116358,0.4745731412494566,0.6545473610147845,0.7479829630649761,0.15641907539706779
    
    事实上,其余部分与您所做的非常相似(我将文件名附加到一个系列中,而不是数据帧中。否则,它们通过
    sum()
    )连接了好几次):


    您可以发布一些模拟输入数据帧的示例数据吗?这里有几个问题。1.df.sum()返回包含
    len(df.columns)
    行(或
    len(df)
    的序列,具体取决于axis=0还是1)。序列中没有列。2.新的_df只是一个系列的列表,因此您最终只会得到另一个系列。3.您应该在
    df['colname']='value'
    上发布完整的回溯。这真的不应该失败。这让我觉得,无论出于什么原因,您的数据实际上只是一列,并作为一个系列读入,但发布一些示例数据将澄清这一点。我相信
    glob.glob('.txt')
    返回的是一个空列表。我相信你想要
    glob.glob('*.txt')
    @Alexander抱歉,typo@ThomasTu如何从以“Filename”作为列的系列列表转到数据帧?我想这就是问题所在——我不明白这一点。你能发布一些模拟输入数据帧的示例数据吗?这里有几个问题。1.df.sum()返回包含
    len(df.columns)
    行(或
    len(df)
    的序列,具体取决于axis=0还是1)。序列中没有列。2.新的_df只是一个系列的列表,因此您最终只会得到另一个系列。3.您应该在
    df['colname']='value'
    上发布完整的回溯。这真的不应该失败。这让我觉得,无论出于什么原因,您的数据实际上只是一列,并作为一个系列读入,但发布一些示例数据将澄清这一点。我相信
    glob.glob('.txt')
    返回的是一个空列表。我相信你想要
    glob.glob('*.txt')
    @Alexander抱歉,typo@ThomasTu如何从以“Filename”作为列的系列列表转到数据帧?我想这就是问题所在——我不明白,你能提供代码吗?我相信这大概就是我所拥有的above@ShanZhengYang给你。我可能只是猜测你的
    pd.read\u csv
    出错了:不同格式的文件?或者glob意外地匹配了不需要的文件?如果不是这样的话,我会先在一个文件上运行循环中的三行代码。你能提供代码吗?我相信这大概就是我所拥有的above@ShanZhengYang给你。我可能只是猜测你的
    pd.read\u csv
    出错了:不同格式的文件?或者glob意外地匹配了不需要的文件?如果不是这样的话,我会尝试先在一个文件上运行循环中的三行代码。