Pandas ile Sütun Aralıklarıyla Dataframe'e Kayıt

Arkadaşlar merhabalar,
Pandas ile okuduğum dataların iki sütun aralıklarla(A1-C1-E1-G1 gibi) dataframe’e kaydedilmesini istiyorum. Acaba aşağıdaki kodumu nasıl geliştirebilirim?

for f in all_files:
    isimler= pd.read_excel(f, skiprows=1, parse_cols="C:C",sheetname='Sheet1', header=None)
    df1 = pd.concat([df1, isimler[:1]], axis=1) 
    print(df1)

Kodlarınızın geri kalan kısmı olmadığı için nasıl geliştirilebilir bilmiyorum.
Ayrıca 3. satırdaki ikinci kez yazılmış olan df1 “NameError: name ‘df1’ is not defined” hatası veriyor.

Diyelim aşağıdaki gibi bir tablonuz var:

resim

ve bu tablonun A, C, E, G ve I sütunlarını alıp başka bir dosyaya kaydetmek istiyorsunuz, o zaman aşağıdaki kodları yazabilirsiniz:

def sutun_kopyala(kaynak, hedef, sutunlar):
    import pandas as pd
    oku = pd.read_excel(kaynak)
    yazici = pd.ExcelWriter(hedef, engine="xlsxwriter")
    pd.DataFrame(oku, columns=sutunlar).to_excel(yazici, sheet_name="Sayfa1", index=False)
    yazici.save()

if __name__ == "__main__":
    test_kaynak = "test.xlsx"
    test_hedef = "yeni.xlsx"
    test_sutunlar = ["A", "C", "E", "G", "I"]
    sutun_kopyala(test_kaynak, test_hedef, test_sutunlar)

Diyelim A, C, E, G ve I sütunlarının sadece 2. ve 3. satırlarını kopyalamak istiyorsunuz, o zaman kodları aşağıdaki gibi değiştirmek gerekir:

def sutun_ve_satir_kopyala(kaynak, hedef, sutunlar, satirlar):
    import pandas as pd
    oku = pd.read_excel(kaynak)
    yazici = pd.ExcelWriter(hedef, engine="xlsxwriter")
    pd.DataFrame(oku, index=satirlar, columns=sutunlar).to_excel(yazici, sheet_name="Sayfa1", index=False)
    yazici.save()


if __name__ == "__main__":
    test_kaynak = "test.xlsx"
    test_hedef = "yeni.xlsx"
    test_sutunlar = ["A", "C", "E", "G", "I"]
    test_satirlar = [1, 2] 
    sutun_ve_satir_kopyala(test_kaynak, test_hedef, test_sutunlar, test_satirlar)

Not: Örnekteki A, C, E, G, I örnek sütun isimleridir, daha farklı da isimlendirilebilirler.

1 Beğeni

Merhabalar,

Çok teşekkürler cevabın için.

Rica ederim, iyi akşamlar dilerim.

1 Beğeni

Merhabalar,
Aslında yapmak istediğim şey Excel dosyasından belli bir sırayla kopyaladığım, sonra da df1 dataframe’ine concatenate ettiğim sütunları belli bir ara ile excel dosyasına yapıştırmak. Yani dataframede yan yana dizilmiş olan sütunlardan 1. sütunu excel dosyasında A1’e, ikinci sütunu A3’e 3. sütunu A5’e…(böyle 50 adet sütunu yapıştırdığımızı varsayalım.) şeklinde yapıştırmak. Şu ana kadar bu kodları kullandım. Fakat bu noktada tıkandım. Yardımlarınız için şimdiden teşekkürler.

import os
import pandas as pd

os.chdir('C:\Tablo')  # Çalışma dizininin yerini ayarla

files = os.listdir('C:\Tablo')

print('*.xls ve *.xlsx formatındaki dosyaların listesi:\n', files)

all_files = [f for f in files if (f[-3:] == 'xls' or f[-4:] == 'xlsx')]

df1 = pd.DataFrame()  # Sütunların kopyalandığı dataframe

for f in all_files:
    # C sütunundaki değerleri al
    isimler = pd.read_excel(f, skiprows=1, parse_cols="C:C", sheetname='Sheet1', header=None)
    df1 = pd.concat([df1, isimler[:1]], axis=1)
print(df1)

from os.path import expanduser

home = expanduser("~\Desktop")  # Bu herhangi bir kullanıcının masaüstü adresini buluyor.

Kaydet = input("Masaüstünde Oluşturulacak Dosyanın Adını Giriniz:")

writer = pd.ExcelWriter(os.path.join(home, Kaydet + '.xlsx'), engine='xlsxwriter')
df1.to_excel(writer, startcol=1, startrow=5, sheet_name='Sheet1', header=None, index=False)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
writer.save()

Belki daha farklı bir yoldan da yapılabiliyordur, aşağıdaki yöntemle de tek bir dosyanın tablosundaki bütün sütunlar, başka bir tabloya, dolu sütunlar arasında bir boş sütun olacak şekilde kaydedilebilir. Ayrıca bir dizinde bulunan bütün benzer dosyalar için bu işlem tekrarlanabilir.

import pandas as pd
import xlsxwriter
import numpy as np


def dosyadan(kaynak, hedef):
    oku = pd.read_excel(kaynak, header=None)
    workbook = xlsxwriter.Workbook(hedef)
    worksheet = workbook.add_worksheet()
    satir = 0
    for i in range(len(oku.values)):
        sutun = 0
        for j in oku.values[0]:
            sec = pd.read_excel(kaynak, parse_cols="{0}:{0}".format(j), header=None)
            df = pd.DataFrame(sec, index=[satir])
            numpy_data = df.get_values()
            string_data = np.array2string(numpy_data).replace("[", "").replace("]", "").replace("'", "")
            worksheet.write(satir, sutun, string_data)
            sutun += 2
        satir += 1
    workbook.close()


def dizinden(kaynak_dizin, hedef_dizin):
    import os
    if not os.path.exists(hedef_dizin):
        os.mkdir(hedef_dizin)
    for i in os.listdir(kaynak_dizin):
        if i.endswith("xlsx") or i.endswith("xls"):
            kaynak_ = os.sep.join([kaynak_dizin, i])
            hedef_ = os.sep.join([hedef_dizin, i])
            dosyadan(kaynak_, hedef_)


if __name__ == "__main__":    
    dizinden("/.../../.", "/.../../.")
1 Beğeni