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

时间:2016-05-03 00:01:34

标签: python pandas dataframe series

我有几个相同格式的pandas DataFrame,有五列。

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

我的问题是如何使用这些系列,并创建另一个Dataframe,一列是文件名,其他列是df.sum()上面的五列

import pandas as pd
import glob

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

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

newdf = pd.concat(newdf, ignore_index=True)

不幸的是,这种方法不起作用。 'df ['filename'] = str(filename)'抛出TypeError,并且创建新数据帧newdf无法正确解析。

如何正确地做到这一点?

如何处理多个pandas.Series个对象并创建DataFrame

2 个答案:

答案 0 :(得分:0)

回答这个具体问题:

  

@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)

答案 1 :(得分:0)

尝试按此顺序:

  1. 创建一个空列表,例如list_of_series

  2. 对于每个文件:

    1. 加载到数据框中,然后将总和保存在一系列s

    2. 向s:s['filename'] = your_filename

    3. 添加元素
    4. s追加到list_of_series

  3. 最后,连接(并根据需要进行转置):

    final_df = pd.concat(list_of_series, axis = 1).T
    
  4. 代码

    的制备:将

    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()多次连接):

    files = glob.glob('*.txt')
    print(files)
    ['3.txt', '0.txt', '4.txt', '2.txt', '1.txt']
    
    list_of_series = []
    for f in files:
        df = pd.read_csv(f)
        s = df.sum()
        s['filename'] = f
        list_of_series.append(s)
    final_df = pd.concat(list_of_series, axis = 1).T
    
    print(final_df)
              A         B          C        D        E filename
    0    1.0675   2.20957    1.65058  1.80515  2.22058    3.txt
    1  0.642805   1.36248  0.0237625  1.87767  1.63317    0.txt
    2   1.68678   1.26363   0.835245  2.05305  1.01829    4.txt
    3   1.22748   2.09256   0.785089  1.87852  2.05043    2.txt
    4  0.910733  0.815614    1.43272  2.65527  1.11553    1.txt