Конкат данных с двойными столбцами - PullRequest
0 голосов
/ 21 октября 2018

У меня есть ряд фреймов данных, который выглядит следующим образом:

   a    b    r
1  43  630  587    

   d    b    c
1  34  30  87

Я хочу создать новый фрейм данных, который выглядит как

1005 *

Я использовал код -

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

, где список appended_data содержит отдельные серии данных в качестве элементов.Ранее, когда я использовал его с другим набором данных, он не выдавал никакой ошибки, но с новым набором данных его показ ValueError: Plan shapes are not aligned

Примечание-Ранее набор данных также имел дублирующиеся столбцы, и тогда он работал нормально, и я также обновил pandas.решения, которые я нашел в Интернете.

полный код-

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

edit-

вывод для-

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

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вы можете использовать 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

Пример данных от Тома Войчика.

0 голосов
/ 21 октября 2018

Для этого вам понадобится внешнее объединение.

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
Документына внешнее объединение

РЕДАКТИРОВАТЬ: OP, pd.concat должно работать, как ожидалось, и Антон доказал это.

Так как 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() для устранения этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...