具有重复列的Concat数据框

时间:2018-10-21 08:22:01

标签: python pandas

我有看起来像这样的数据框系列-

   a    b    r
1  43  630  587    

   d    b    c
1  34  30  87

我想创建一个看起来像新的数据框-

 a   b     r    d   c
 43  630  587   0   0
 0    30   0    34  87

我已经使用了代码-

appended_data= pd.concat(appended_data, axis=0)

其中列表append_data包含各个数据框系列作为元素。 早些时候,当我将其与其他数据集结合使用时,它并没有引发任何错误,但在新数据集中却显示了ValueError: Plan shapes are not aligned

Note-Earlier数据集也有重复的列,然后工作正常,我还更新了熊猫。这些是我在网上找到的解决方案。

完整代码-

dir_list = [benign_freq_dir,malign_freq_dir]

    appended_data = []

    for l in dir_list: 
        for root, dirs, files in os.walk(l):
            #print(root)
            for name in files:

                file = open(root+"/"+name,'r') 
                print(name)
                print("\n")
                df = pd.read_csv(file,header=None,error_bad_lines=False)   #In windows and python3 always pass file object not the path directly in pd.read_csv                
                #print(df)
                df = df.rename(columns={0: 'col'})
                #print(df)   
                df = pd.DataFrame(df.col.str.split(' ',1).tolist(), columns = ['col1','col2']).T.reset_index(drop=True)          
                df = df.rename(columns=df.iloc[0]).drop(df.index[0])
                print(df)


                appended_data.append(df)
                if l==benign_freq_dir:
                    df['class']=0
                else:
                    df['class']=1

    #for l in appended_data:
    #   print(l)
    #   print(type(l))  
    appended_data= pd.concat(appended_data, axis=0,sort=False)

enter image description here

编辑-

输出-

for dfx in appended_data: 
        print(dfx.head(2).to_dict())

enter image description here

2 个答案:

答案 0 :(得分:2)

您将需要一个外部联接。

import pandas as pd

df1 = pd.DataFrame({
    'a': [43],
    'b': [630],
    'r': [587]
})

df2 = pd.DataFrame({
    'd': [34],
    'b': [30],
    'c': [87]
})

df3 = df1.merge(df2, how='outer').fillna(0)
print(df3)

满足您的需求。

      a    b      r     d     c
0  43.0  630  587.0   0.0   0.0
1   0.0   30    0.0  34.0  87.0

pd.merge上的文档
outer join

上的文档

编辑: OP,pd.concat应该可以按预期工作,而Anton证明了这一点。

因为pd.merge是我的答案,所以我必须坚持。

如果要合并数据帧列表,请使用一些伪代码。

def merge(lst, df=None):
    if df is None:
        df = lst.pop()
    to_be_merged = lst.pop()
    merged = df.merge(to_be_merged, how='outer')
    if lst:
        return merge(lst, merged)
    return merged.fillna(0)

df = merge(list_of_dfs)

这样,您就可以立即知道哪个df有问题,因为显然您的数据存在问题。捕获异常并使用.describe().info()调试此问题。

答案 1 :(得分:1)

您可以使用pd.concat。但是,您应该同时传递两个数据帧。

pd.concat([df1,df2], axis=0, sort=False).fillna(0) #.astype(int) for ints

#      a    b      r     d     c
#0  43.0  630  587.0   0.0   0.0
#0   0.0   30    0.0  34.0  87.0

Tom Wojcik的样本数据。