Tablolar Arası Veri Transferi

Merhaba Arkadaşlar
Bir Excel dosyasından diğer Excel dosyasına şarta bağlı veri almak istiyorum.
Yapmak istediğim; Eğer Ana Tablodaki “KURUM_KODU” Bina_Kullanım tablosundaki "KURUM_KODU"na eşitse ve Bina_Kullanım tablosundaki “KULLANIM_ALANI” başlığı “8- TOPLAM DERSLİK SAYISI” na eşitse, Bina_Kullanım tablosundaki “SAYISI” nı Ana Tablodaki “DERSLİK_SAYISI” başlığına yazdır.Yoksa “0” yazdır.
Üzerinde uğraşıp yapamadığım kod;

import glob
import pandas as pd
import numpy as np

f = pd.read_excel(r"C:\Users\ErdalOZDEMIR\Desktop\PYTHON_DATA\RAPORLAR\ANA_TABLO.xlsx") 
df_Ana= pd.DataFrame(f,columns=["KURUM_KODU","TİPİ","İLÇE","OKUL_KURUM_ADI","DERSLİK_SAYISI"])
print(df_Ana)

f = pd.read_excel(r"C:\Users\ErdalOZDEMIR\Desktop\PYTHON_DATA\RAPORLAR\BİNA_KULLANIM.xlsx")
df_Bina = pd.DataFrame(f,columns=["KURUM_KODU","TİPİ","İLÇE","KULLANIM_ALANI","OKUL_KURUM_ADI","SAYISI"])  
print(df_Bina)

#Eğer Ana Tablodaki "KURUM_KODU" Bina_Kullanım tablosundaki "KURUM_KODU"na eşitse ve Bina_Kullanım tablosundaki "KULLANIM_ALANI" başlığı "8- TOPLAM DERSLİK SAYISI" na
#eşitse, Bina_Kullanım tablosundaki "SAYISI" nı Ana Tablodaki "DERSLİK_SAYISI" başlığına yazdır.Yoksa "0" yazdır


df_Ana.set_index("KURUM_KODU")
df_Bina.set_index("KURUM_KODU")

df_Ana["DERSLİK_SAYISI"]=(df_Ana["KURUM_KODU"]==df_Bina["KURUM_KODU"] and df_Bina.loc[(df_Bina["KULLANIM_ALANI"])=="8- TOPLAM DERSLİK SAYISI"]),df_Bina["SAYISI"]
print(df_Ana)

df_Ana.to_excel(r"C:\Users\ErdalOZDEMIR\Desktop\PYTHON_DATA\RAPORLAR\ANA_TABLO.xlsx",index=False)


Excel dosyalarını paylaşma imkânınız var mı? Ayrıca pandas yerine polars kullanmanız sizin için sorun olur mu?

Merhaba,
(Dosyalarınızın yedeğini alarak) aşağıdaki kodu dener misiniz?

UYARI;
Ana veriniz kaybolmasın diye, kod çalıştırıldğında çıktı “ANA_TABLO_.xlsx” dosyasına yazılacaktır.

"""
İSTENİLEN:
Koşul 1: Eğer ANA_TABLO'daki "KURUM_KODU", BİNA_KULLANIM tablosundaki "KURUM_KODU"na eşitse ve 
Koşul 2: BİNA_KULLANIM tablosundaki "KULLANIM_ALANI" sütunu "8- TOPLAM DERSLİK SAYISI" na eşitse,

BİNA_KULLANIM tablosundaki "SAYISI" sütununu ANA_TABLO'daki "DERSLİK_SAYISI" sütununa yazdır. Yoksa "0" yazdır.
"""

import pandas as pd

dosya = pd.read_excel("ANA_TABLO.xlsx", index_col=0) 
df_ana= pd.DataFrame(dosya,columns=["TİPİ","İLÇE","OKUL_KURUM_ADI","DERSLİK_SAYISI"])

dosya = pd.read_excel("BİNA_KULLANIM.xlsx", index_col=0)
df_bina = pd.DataFrame(dosya,columns=["TİPİ","İLÇE","KULLANIM_ALANI","OKUL_KURUM_ADI","SAYISI"])  

kosul = df_bina["KULLANIM_ALANI"] == "8- TOPLAM DERSLİK SAYISI"
df_gecici = df_bina[kosul]    # "df_bina" isimli Veri Çerçevesinde "KULLANIM_ALANI" sütunu "8- TOPLAM DERSLİK SAYISI" ifadesine eşit olan verilerden müteşekkil geçicici bir Veri Çerçevesinde oluşturuyoruz.

df_pivot = pd.pivot_table(
    data = df_gecici, 
    index="KURUM_KODU", 
    values="SAYISI", 
    aggfunc="sum")    # "df_gecici" isimli Veri Çerçevesinde aynı KURUM_KODU'na sahip birden fazla veri olduğu için bu değerleri toplayarak, her Kurum Koduna ait bir değer içeren geçici bir Veri Çerçevesinde daha oluşturuyoruz.

df_pivot.columns = ["DERSLİK_SAYISI"]    # "SAYISI" olan sütun adını "DERSLİK_SAYISI" olarak değiştiriyoruz.

df_ana.drop("DERSLİK_SAYISI",axis=1, inplace=True)   # "df_ana" isimli  Veri Çerçevesinde  "DERSLİK_SAYISI" sütununda veri olmadığı için siliyorum.

df_sonuc =pd.merge(df_ana, df_pivot, on = "KURUM_KODU", how = "left")    # "df_ana" ve "df_pivot" Veri Çerçevelerini, df_ana'yı baz alarak birleştiriyorum.

df_sonuc.to_excel("ANA_TABLO_.xlsx")

Kodu denerken kullandığım veriler;

ANA_TABLO
              TİPİ      İLÇE                OKUL_KURUM_ADI  DERSLİK_SAYISI
KURUM_KODU                                                               
11          RESMİ    SARICA          HalkEğitimi Merkezi              NaN
12          RESMİ    BÜNYAN             Atatürk İlkokulu              NaN
13          RESMİ  ŞARKIŞLA            Atatürk Ortaokulu              NaN
14          RESMİ    SARICA             Kırboğa İlkokulu              NaN
15          RESMİ    SARICA            Kırboğa Ortaokulu              NaN
16          RESMİ    BÜNYAN           Halk Eğitim Merkezi             NaN
17          RESMİ  ŞARKIŞLA           Kutu Tepe İlkokulu              NaN
18          RESMİ    SARICA           Kutu Tepe Ortaokulu             NaN
19          RESMİ    SARICA             Ortaköy İlkokulu              NaN
20          RESMİ    BÜNYAN            Ortaköy Ortaokulu              NaN
21          RESMİ  ŞARKIŞLA          İmam Hatip Ortaokulu             NaN
22          RESMİ    SARICA  Çok Programlı Anadolu Lisesi             NaN
23          RESMİ    SARICA              Sanica Anaokulu              NaN
24          RESMİ    BÜNYAN              Dereli İlkokulu              NaN
25          RESMİ  ŞARKIŞLA             Dereli Ortaokulu              NaN
26          RESMİ    SARICA              Atatürk İlkokulu             NaN

BİNA__KULLANIM
              TİPİ       İLÇE            KULLANIM_ALANI         OKUL_KURUM_ADI  SAYISI
KURUM_KODU                                                                           
11          RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI   Halk Eğitimi Merkezi      22
11          RESMİ     SARICA       BİLGİSAYAR SAYISI     Halk Eğitimi Merkezi      25
12          RESMİ     BÜNYAN  8- TOPLAM DERSLİK SAYISI       Atatürk İlkokulu      12
13          RESMİ   ŞARKIŞLA  8- TOPLAM DERSLİK SAYISI     Atatürk Ortaokulu        5
14          RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI      Kirboga İlkokulu        4
12          RESMİ     BÜNYAN       BİLGİSAYAR SAYISI         Atatürk İlkokulu       9
14          RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI      Kirboga İlkokulu       12
15          RESMİ     SARICA       BİLGİSAYAR SAYISI       Kirboga Ortaokulu       21
16          RESMI     BUNYAN  8- TOPLAM DERSLİK SAYISI    Halk Eğitim Merkezi      14
17          RESMİ  ŞARKIŞLA   8- TOPLAM DERSLİK SAYISI     Kutu Tepe İlkokulu      12
17          RESMİ   ŞARKIŞLA       BİLGİSAYAR SAYISI      Kutu Tepe İlkokulu        5
18          RESMİ     SARICA       BİLGİSAYAR SAYISI      Kutu Tepe Ortaokulu       8
19          RESMİ     SARICA       BİLGİSAYAR SAYISI         Ortaköy İlkokulu       5
16          RESMI     BUNYAN  8- TOPLAM DERSLİK SAYISI    Halk Eğitim Merkezi       9
20          RESMİ     BÜNYAN  8- TOPLAM DERSLİK SAYISI  Ortaköy Ortaokulu İS-      10
21          RESMİ   ŞARKIŞLA       BİLGİSAYAR SAYISI    İmam Hatip Ortaokulu        4
22          RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI  Çok Programlı Anadolu       5
23           ÖZEL     SARICA  8- TOPLAM DERSLİK SAYISI   OZELSARICA ANAOKULU       12
23          RESMİ     SARICA       BİLGİSAYAR SAYISI     ÖZELSARICA ANAOKULU        7
24          RESMİ     BÜNYAN  8- TOPLAM DERSLİK SAYISI        Dereli İlkokulu       4
25          RESMİ   ŞARKIŞLA  8- TOPLAM DERSLİK SAYISI      Dereli Ortaokulu        5
26          RESMİ     SARICA       BİLGİSAYAR SAYISI         Atatürk İlkokulu       4
26          RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI      Atatürk İlkokulu        7

ÇIKTI:

KURUM KODU   TİPİ      İLÇE               OKUL_KURUM_ADI   DERSLİK_SAYISI
11          RESMİ    SARICA          HalkEğitimi Merkezi             22.0
12          RESMİ    BÜNYAN             Atatürk İlkokulu             12.0
13          RESMİ  ŞARKIŞLA            Atatürk Ortaokulu              5.0
14          RESMİ    SARICA             Kırboğa İlkokulu             16.0
15          RESMİ    SARICA            Kırboğa Ortaokulu              NaN
16          RESMİ    BÜNYAN           Halk Eğitim Merkezi            23.0
17          RESMİ  ŞARKIŞLA           Kutu Tepe İlkokulu            12.0
18          RESMİ    SARICA           Kutu Tepe Ortaokulu             NaN
19          RESMİ    SARICA             Ortaköy İlkokulu              NaN
20          RESMİ    BÜNYAN            Ortaköy Ortaokulu             10.0
21          RESMİ  ŞARKIŞLA          İmam Hatip Ortaokulu             NaN
22          RESMİ    SARICA  Çok Programlı Anadolu Lisesi             5.0
23          RESMİ    SARICA              Sanica Anaokulu             12.0
24          RESMİ    BÜNYAN              Dereli İlkokulu              4.0
25          RESMİ  ŞARKIŞLA             Dereli Ortaokulu              5.0
26          RESMİ    SARICA              Atatürk İlkokulu             7.0
1 Beğeni

Mustafa Hocam, Hayırlı akşamlar.
Denedim, örnek tablolarda verileri getiriyor. Sütun yerleri değiştiğinde (Kurum_Kodu) hata veriyor. Benim kullandığım gerçek tablolar yaklaşık 30-40 bin satır aralığında ve sütunların konumunda sabitlik yok. Mustafa Hocam, hız olarak VBA ya göre nasıldır. Birde bu kodun Python olarak başka kısa bir yolu var mı
Teşekkür ederim

Hayırlı akşamlar,
Bahsettiğiniz işlem eğer;

  • Bir dosyadaki belirli veriler filtrelendikten sonra toplanacak,
  • Diğer dosyadaki veriler ile eşleştirilip istenilen sütun değerleri kopyalanacak ya da toplanacak,
    ise, Excel’de VBA (makro) kullanmanıza gerek kalmadan, Özet Tablo (Pivot Table) ve düşeyara formlü ile kolaylıkla gerçekleştirilebilir.

Yazdığım kodun elbette daha kısası yazılabilir ancak sonuçta okuma kolaylığı için eklenen satır boşlukları düzeltilecek olursa import satırı dahil 12 satır (yukarıdaki kodun daha derli toplu hali aşağıda) :slight_smile:

import pandas as pd
dosya = pd.read_excel("ANA_TABLO.xlsx", index_col=0) 
df_ana= pd.DataFrame(dosya,columns=["TİPİ","İLÇE","OKUL_KURUM_ADI","DERSLİK_SAYISI"])
dosya = pd.read_excel("BİNA_KULLANIM.xlsx", index_col=0)
df_bina = pd.DataFrame(dosya,columns=["TİPİ","İLÇE","KULLANIM_ALANI","OKUL_KURUM_ADI","SAYISI"])  
kosul = df_bina["KULLANIM_ALANI"] == "8- TOPLAM DERSLİK SAYISI"
df_gecici = df_bina[kosul]    # "df_bina" isimli Veri Çerçevesinde "KULLANIM_ALANI" sütunu "8- TOPLAM DERSLİK SAYISI" ifadesine eşit olan verilerden müteşekkil geçicici bir Veri Çerçevesinde oluşturuyoruz.
df_pivot = pd.pivot_table(data = df_gecici, index="KURUM_KODU", values="SAYISI", aggfunc="sum")    # "df_gecici" isimli Veri Çerçevesinde aynı KURUM_KODU'na sahip birden fazla veri olduğu için bu değerleri toplayarak, her Kurum Koduna ait bir değer içeren geçici bir Veri Çerçevesinde daha oluşturuyoruz.
df_pivot.columns = ["DERSLİK_SAYISI"]    # "SAYISI" olan sütun adını "DERSLİK_SAYISI" olarak değiştiriyoruz.
df_ana.drop("DERSLİK_SAYISI",axis=1, inplace=True)   # "df_ana" isimli  Veri Çerçevesinde  "DERSLİK_SAYISI" sütununda veri olmadığı için siliyorum.
df_sonuc =pd.merge(df_ana, df_pivot, on = "KURUM_KODU", how = "left")    # "df_ana" ve "df_pivot" Veri Çerçevelerini, df_ana'yı baz alarak birleştiriyorum.
df_sonuc.to_excel("ANA_TABLO_.xlsx")

Mustafa Hocam, onlarca tablodan bir tabloya birçok veri çekme durumu oluyor. Ben VBA ile yapıyorum. Fakat kodlar çok uzun ve çok yavaş. Bu yüzden Python denemeye kara verdim.
Gerçek tablolar üzerinde denedim. Ana tabloya Bina Kullanım tablosundaki veriler gelip, Ana tablonun içeriği tamamen değiştiriyor. Ana tablonun sadece “DERSLİK_SAYISI” sütununa işlem yapması durumu var mı. Ana tablonun üzerine yazdırmadan işlem yapılıp kayıt yapılıp çıkılsa böyle olur mu
Teşekkür ederim.

Merhaba,
Orjinal dosyalarınızı görmeden, kodları çalıştırmadan tam olarak istediğinizi gerçekleştirme konusunda doğru cevap vermek mümkün olmayabilir.

Ana tablonun sadece “DERSLİK_SAYISI” sütununa işlem yapması durumu var mı. Ana tablonun üzerine yazdırmadan işlem yapılıp kayıt yapılıp çıkılsa böyle olur mu?

dediniz, df_sonuc =pd.merge(df_ana, df_pivot, on = "KURUM_KODU", how = "left") kodu ile zaten “df_ana” Veri Çerçevesi (Tablosu) baz alarak birleştirme işlemi uygulanıyor.

Verileriniz kaybolmasın diye df_sonuc.to_excel("ANA_TABLO_.xlsx") kodu ile çalışmayı farklı bir isimle kayıt ettim. kodu df_sonuc.to_excel("ANA_TABLO.xlsx") olarak düzeltirseniz, orjinal dosya üzerinde değişiklik yapmış olursunuz.

Merhaba Mustafa Hocam,
pivot tablo yapmadan da verileri alabilir miyiz
Orijinal tabloda derslik sütununun yanında bir çok sütun var.
Bu şekilde Derslik Sayısı sütunu bu sütunların en sonuna atılıyor.

Merhaba,
Paylaştığınız ekran görüntüsünde aynı Kurum koduna sahip birden fazla “8- Toplam Daerslik Sayısı” ibaresi gördüğüm için (örneğin 14 ve 16 kurum kodlarında) pivot kullanma gereği duydum.

Pivot dışında gruplama groupby ve filtreleme metotlarını kullanarak toplam miktarları elde edebilirsin.
Aksi halde doğru değerleri elde edemeyebilirsiniz (iki veriden sadece bir tanesi toplama eklenebilir).

ANA_TABLO.xlsx dosyanızdaki sayfa ve tablo düzeninizin değişmesini istemiyorsanız, python ile elde ettiğiniz verileri farklı bir excel dosyasına aktarıp (örneğin sadece kurum kodu ve toplam sayılardan oluşan sonuc.xlsx dosyası), ANA_TABLO.xlsx dosyanızda DERSLİK_SAYISI sütunu için, sonuc.xlsx dosyasından bağlantı (link) oluşturabilirsiniz. Bu şekilde python her çalıştırıldığında sadece sizin istediğiniz verileri barındıran sonuc.xlsx dosyası elde edersiniz. ANA_TABLO.xlsx dosyasını açıp bağlantıları güncellediğinizde istediğinizi elde edebilirsiniz.

Hayırlı akşamlar
Hocam, # koşul=df_bina.loc[lambda df_bina: df_bina[‘KULLANIM_ALANI’] == ‘8- TOPLAM DERSLİK SAYISI’,‘SAYISI’] bununun gibi bir yöntemle verileri alabilir miyiz
Bu benim için pyhtonu diğer veri almalarımda da kullanacağımdan çok önemli , yoksa öğrennmeninde bir anlamı kalmıyor.
Başka kütüphaneler ile verileri alabilir miyim

Merhaba,
df.loc[lambda df: df['shield'] == 8] bu tür lambda fonksiyonu kullanılarak “koşula göre seçim” yapmak elbette mümkün ancak bu tür bir kodla değer değil bir data frame seçmiş oluyoruz.
Örneğin:
df_lambda = df_bina.loc[lambda df_bina : (df_bina["KULLANIM_ALANI"] == "8- TOPLAM DERSLİK SAYISI")]
print(df_lambda) kodunun çıktısı şudur;

Çıktı;

 KURUM_KODU   TİPİ       İLÇE            KULLANIM_ALANI         OKUL_KURUM_ADI  SAYISI
0           11  RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI   Halk Eğitimi Merkezi      22
2           12  RESMİ     BÜNYAN  8- TOPLAM DERSLİK SAYISI       Atatürk İlkokulu      12
3           13  RESMİ   ŞARKIŞLA  8- TOPLAM DERSLİK SAYISI     Atatürk Ortaokulu        5
4           14  RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI      Kirboga İlkokulu        4
6           14  RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI      Kirboga İlkokulu       12
8           16  RESMI     BUNYAN  8- TOPLAM DERSLİK SAYISI    Halk Eğitim Merkezi      14
9           17  RESMİ  ŞARKIŞLA   8- TOPLAM DERSLİK SAYISI     Kutu Tepe İlkokulu      12
13          16  RESMI     BUNYAN  8- TOPLAM DERSLİK SAYISI    Halk Eğitim Merkezi       9
14          20  RESMİ     BÜNYAN  8- TOPLAM DERSLİK SAYISI  Ortaköy Ortaokulu İS-      10
16          22  RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI  Çok Programlı Anadolu       5
17          23   ÖZEL     SARICA  8- TOPLAM DERSLİK SAYISI   OZELSARICA ANAOKULU       12
19          24  RESMİ     BÜNYAN  8- TOPLAM DERSLİK SAYISI        Dereli İlkokulu       4
20          25  RESMİ   ŞARKIŞLA  8- TOPLAM DERSLİK SAYISI      Dereli Ortaokulu        5
22          26  RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI      Atatürk İlkokulu        7

Bu durumda hala 14 ve 16 numaralı KURUM_KODU’na ait birden fazla değer var. Bu değerleri pivot() veya groupby() metotları kullanılarak toplanmalı.

Bu işlemden sonra df_ana ile df_lambda isimli dataframe verileri (concat(), merge(), join() gibi metotlarla birleştirilebileceği gibi, df_ana["DERSLİK_SAYISI"] = df_lambda["SAYISI"] kodu ile ilgili veriler, df_ana["DERSLİK_SAYISI"] sütununa atanabilir.

Seçim yapmak için İki koşul kullanılacaksa and operatörü yerine & işareti kullanılmalı: Örnek 2:
df_lambda = df_bina.loc[lambda df_bina : (df_bina["KULLANIM_ALANI"] == "8- TOPLAM DERSLİK SAYISI") & (df_bina["KURUM_KODU"] == 16)]
print(df_lambda) kodunun çıktısı şudur;

Çıktı;

KURUM_KODU   TİPİ    İLÇE            KULLANIM_ALANI       OKUL_KURUM_ADI  SAYISI
8           16  RESMI  BUNYAN  8- TOPLAM DERSLİK SAYISI  Halk Eğitim Merkezi      14
13          16  RESMI  BUNYAN  8- TOPLAM DERSLİK SAYISI  Halk Eğitim Merkezi       9

Önceki mesajlarda paylaştığım kodlar işe yaramadı mı?
Acaba sorunun tam olarak ne olduğunu mu anlayamadım? Çünkü Paylaştığınız ekran görüntülerine göre verileri oluşturup kodu çalıştırdığımda, sonucu elde ediyorum.
Aşağıdaki kod ile;

  • KURUM_KODU’na ait birden fazla değer varsa toplamlarını alıyor ve bir veri çerçevesinde tutuyorum.
df1 = df_bina.loc[lambda df_bina : (df_bina["KULLANIM_ALANI"] == "8- TOPLAM DERSLİK SAYISI")]
df1 = df1.groupby("KURUM_KODU").sum()["SAYISI"]

Çıktısı:

KURUM_KODU
11    22
12    12
13     5
14    16
16    23
17    12
20    10
22     5
23    12
24     4
25     5
26     7
Name: SAYISI, dtype: int64

df1’i şu şekilde yazsaydık ta aynı sonucu elde ederdik;
df1 = df_bina[df_bina["KULLANIM_ALANI"] == "8- TOPLAM DERSLİK SAYISI"]

df_ana tablosunun index değerini “KURUM_KODU” olarak atayıp df_ana["DERSLİK_SAYISI"] sütun değerlerini df1e atarsak (eşitlersek) sorun çözülüyor gibi görünüyor.

df_ana = df_ana.set_index("KURUM_KODU")

df_ana["DERSLİK_SAYISI"] = df1
print(df_ana)

Çıktı:

             TİPİ      İLÇE                OKUL_KURUM_ADI  DERSLİK_SAYISI
KURUM_KODU                                                               
11          RESMİ    SARICA          HalkEğitimi Merkezi             22.0
12          RESMİ    BÜNYAN             Atatürk İlkokulu             12.0
13          RESMİ  ŞARKIŞLA            Atatürk Ortaokulu              5.0
14          RESMİ    SARICA             Kırboğa İlkokulu             16.0
15          RESMİ    SARICA            Kırboğa Ortaokulu              NaN
16          RESMİ    BÜNYAN           Halk Eğitim Merkezi            23.0
17          RESMİ  ŞARKIŞLA            Kutu Tepe İlkokulu            12.0
18          RESMİ    SARICA           Kutu Tepe Ortaokulu             NaN
19          RESMİ    SARICA             Ortaköy İlkokulu              NaN
20          RESMİ    BÜNYAN            Ortaköy Ortaokulu             10.0
21          RESMİ  ŞARKIŞLA          İmam Hatip Ortaokulu             NaN
22          RESMİ    SARICA  Çok Programlı Anadolu Lisesi             5.0
23          RESMİ    SARICA              Sanica Anaokulu             12.0
24          RESMİ    BÜNYAN              Dereli İlkokulu              4.0
25          RESMİ  ŞARKIŞLA             Dereli Ortaokulu              5.0
26          RESMİ    SARICA              Atatürk İlkokulu             7.0

Konsol ekranında NaN (Not A Number) yazması sizi şaşırtmasın. Vevi çerçevesini dışa aktardığınızda (excel dosyası olarak kaydettiğinizde) ilgili hücreler boş olarak görüntüleniyor.

Birçok dosya ile çalışıyorum ve veriler çok satırlı diyorsunuz.
Farklı dosya içerikleri varsa bunları ya da ekran görüntülerini paylaşırsanız, kodu onlar üzerinde çalıştırarak ta deneyebilirim.

Hayırlı akşamlar
Mustafa Hocam, öncelikle elinize emeğinize sağlık. Çok teşekkür ederim.

Hocam merhaba
Dendim tamamdır. Teşekkür ederim.
Pivot tablo ile derslik sayısı sütununu her defasında sona atıyordu. Buyüzden kullanamadım.

Hocam, df1 = df1.groupby(“KURUM_KODU”).sum()[“SAYISI”]"] Burda tekrar edenler olmasaydı yani bu komuttan sum()'u kaldırdığmızda bu komut nasıl olurdu.

Merhaba,

groupby() Fonksiyonu:

Veri Çerçevemizde aynı isme ya da aynı değere sahip birden fazla veri bilgisi olabilir. Verileri gruplayarak, grupların toplam değerleri, ortalama değerleri, grupta kaç adet veri bulunduğu, gruptaki verilerden en küçük ya da en büyük verinin hangisi olduğu gibi pek çok bilgi edinmek için, groupby() metodundan yararlanırız.

Söylediğiniz gibi KURUM KODU ve KULLANIM ALANI birleşiminde (aşağıdaki tabloda olduğu gibi) birer adet veri varsa yani tekrar eden veri yoksa, groupby() fonksiyonunu kullanmamıza gerek kalmaz.

BİNA_KULLANIM Tekrarsiz:
     KURUM_KODU   TİPİ       İLÇE            KULLANIM_ALANI         OKUL_KURUM_ADI  SAYISI
0           11  RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI   Halk Eğitimi Merkezi      22
1           11  RESMİ     SARICA       BİLGİSAYAR SAYISI     Halk Eğitimi Merkezi      25
2           12  RESMİ     BÜNYAN  8- TOPLAM DERSLİK SAYISI       Atatürk İlkokulu      12
3           13  RESMİ   ŞARKIŞLA  8- TOPLAM DERSLİK SAYISI     Atatürk Ortaokulu        5
4           14  RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI      Kirboga İlkokulu        4
5           12  RESMİ     BÜNYAN       BİLGİSAYAR SAYISI         Atatürk İlkokulu       9
6           15  RESMİ     SARICA       BİLGİSAYAR SAYISI       Kirboga Ortaokulu       21
7           16  RESMI     BUNYAN  8- TOPLAM DERSLİK SAYISI    Halk Eğitim Merkezi      14
8           17  RESMİ  ŞARKIŞLA   8- TOPLAM DERSLİK SAYISI     Kutu Tepe İlkokulu      12
9           17  RESMİ   ŞARKIŞLA       BİLGİSAYAR SAYISI      Kutu Tepe İlkokulu        5
10          18  RESMİ     SARICA       BİLGİSAYAR SAYISI      Kutu Tepe Ortaokulu       8
11          19  RESMİ     SARICA       BİLGİSAYAR SAYISI         Ortaköy İlkokulu       5
12          20  RESMİ     BÜNYAN  8- TOPLAM DERSLİK SAYISI  Ortaköy Ortaokulu İS-      10
13          21  RESMİ   ŞARKIŞLA       BİLGİSAYAR SAYISI    İmam Hatip Ortaokulu        4
14          22  RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI  Çok Programlı Anadolu       5
15          23   ÖZEL     SARICA  8- TOPLAM DERSLİK SAYISI   OZELSARICA ANAOKULU       12
16          23  RESMİ     SARICA       BİLGİSAYAR SAYISI     ÖZELSARICA ANAOKULU        7
17          24  RESMİ     BÜNYAN  8- TOPLAM DERSLİK SAYISI        Dereli İlkokulu       4
18          25  RESMİ   ŞARKIŞLA  8- TOPLAM DERSLİK SAYISI      Dereli Ortaokulu        5
19          26  RESMİ     SARICA       BİLGİSAYAR SAYISI         Atatürk İlkokulu       4
20          26  RESMİ     SARICA  8- TOPLAM DERSLİK SAYISI      Atatürk İlkokulu        7

Excel’de Pivot Tablo kullanılarak KURUM KODU ve KULLANIM ALANI birleşimi incelendiğinde aşağıdaki gibi birer adet veri olduğu teyit edilebilir;

KURUM_KODU		KULLANIM_ALANI		Say - KULLANIM_ALANI
11			8- TOPLAM DERSLİK SAYISI		1
			BİLGİSAYAR SAYISI  			    1
12			8- TOPLAM DERSLİK SAYISI		1
			BİLGİSAYAR SAYISI  			    1
13			8- TOPLAM DERSLİK SAYISI		1
14			8- TOPLAM DERSLİK SAYISI		1
15			BİLGİSAYAR SAYISI  			    1
16			8- TOPLAM DERSLİK SAYISI		1
17			8- TOPLAM DERSLİK SAYISI		1
			BİLGİSAYAR SAYISI  			    1
18			BİLGİSAYAR SAYISI  			    1
19			BİLGİSAYAR SAYISI  			    1
20			8- TOPLAM DERSLİK SAYISI		1
21			BİLGİSAYAR SAYISI  			    1
22			8- TOPLAM DERSLİK SAYISI		1
23			8- TOPLAM DERSLİK SAYISI		1
			BİLGİSAYAR SAYISI  			    1
24			8- TOPLAM DERSLİK SAYISI		1
25			8- TOPLAM DERSLİK SAYISI		1
26			8- TOPLAM DERSLİK SAYISI		1
			BİLGİSAYAR SAYISI  			    1

Bu durumda aşağıdaki kod işinize yarayacaktır.

import pandas as pd

dosya = pd.read_excel("ANA_TABLO.xlsx") 
df_ana= pd.DataFrame(dosya,columns=["KURUM_KODU", "TİPİ","İLÇE","OKUL_KURUM_ADI","DERSLİK_SAYISI"])

dosya = pd.read_excel("BİNA_KULLANIM_Tekrarsiz.xlsx")
df_bina = pd.DataFrame(dosya,columns=["KURUM_KODU", "TİPİ","İLÇE","KULLANIM_ALANI","OKUL_KURUM_ADI","SAYISI"])  

df1 = df_bina[df_bina["KULLANIM_ALANI"] == "8- TOPLAM DERSLİK SAYISI"]    # filtre uyguluyoruz

df_ana = df_ana.set_index("KURUM_KODU") # indeks değerleri ayarlanıyor.
df1 = df1.set_index("KURUM_KODU") # indeks değerleri ayarlanıyor.

df_ana["DERSLİK_SAYISI"] = df1["SAYISI"]

df_ana.to_excel("ANA_TABLO_SONUC.xlsx")

Bu kod ile, ANA_TABLO.xlsx dosyası üzerinde değişiklik yapmamış olduk. Çıktı değerleri ANA_TABLO_SONUC.xlsx dosyasına kaydedilir. Böylece ANA_TABLO.xlsx dosyanızın yapısı bozulmamış olur. Bağlantı ile verileri ana dosyanıza otomatik olarak güncelleyebilirsiniz.

Şunu da ifade edeyim ki;
Tekrar eden veriler olmasa da ( df1 = df1.groupby("KURUM_KODU").sum()["SAYISI"]) kodunu kullanarak aynı sonucu elde ederiz.
Çünkü tekrar eden veri yoksa, değerler toplamı kendisine eşittir :slight_smile:

df1 = df1.groupby("KURUM_KODU").sum()["SAYISI"]`)
print(df1)

Tekrar eden veri olmadığı durumda da sum() metodunu kullanarak yukarıdaki kod çıktısını inceleyebilirsiniz.

Tüm kod ise şudur;

import pandas as pd

dosya = pd.read_excel("ANA_TABLO.xlsx") #, index_col=0) 
df_ana= pd.DataFrame(dosya,columns=["KURUM_KODU", "TİPİ","İLÇE","OKUL_KURUM_ADI","DERSLİK_SAYISI"])

dosya = pd.read_excel("BİNA_KULLANIM_Tekrarsiz.xlsx") #, index_col=0)
df_bina = pd.DataFrame(dosya,columns=["KURUM_KODU", "TİPİ","İLÇE","KULLANIM_ALANI","OKUL_KURUM_ADI","SAYISI"])  

df1 = df_bina[df_bina["KULLANIM_ALANI"] == "8- TOPLAM DERSLİK SAYISI"]    
df1 = df1.groupby("KURUM_KODU").sum()["SAYISI"]

df_ana = df_ana.set_index("KURUM_KODU") # indeks değerleri ayarlanıyor.

df_ana["DERSLİK_SAYISI"] = df1

df_ana.to_excel("ANA_TABLO_SONUC4.xlsx")

Merhaba Hocam,
Hocam sorun çözülmüştür. İlgi alaka ve konuyu ayrıntılı ve eğitici bir şekilde açıklamalarınız için teşekkür ederim. Elinize emeğinize sağlık. Bu durum yeni öğrenmeye çalışanlar için çok değerli.
Hocam birde şunu öğrenebilirim miyim;, Acaba şöyle bir komut var mı Sayfa Biçimini Koru eğer yoksa, sütun ve satırları eşit dağıt gibi biçimlendirme komutları var mı. Araştırdım fakat bir sonuca ulaşamadım.

Rica ederim. Sorunun çözülmesine sevindim. :slight_smile:
Konuyu okuyanlar da faydalansın diye detaylı anlatmaya çalıştım.

Excel dosyaları ve Stlleri ile çalışmak için OpenPyXl kütüphanesi kullanılabilir sanıyorum.
Bu kütüphaneyi (modülü) kullanmadım ancak dokümantasyonuna bakınca istediğinizi yapacak kadar kapsamlı hazırlandığı kanaatine vardım :slight_smile:

Openpyxl, Nedir?

openpyxl, Excel 2010 xlsx/xlsm/xltx/xltm dosyalarını okumak/yazmak için kullanılan bir Python kütüphanesidir.
Python’dan Office Open XML formatını yerel olarak okumak/yazmak için mevcut kütüphane eksikliğinden doğmuştur.
Kaynak: openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files — openpyxl 3.1.2 documentation

Stiller

Stiller, ekranda görüntülenirken verilerinizin görünümünü değiştirmek için kullanılır. Ayrıca sayıların biçimlendirmesini belirlemek için de kullanılırlar.

Stiller aşağıdaki hususlara uygulanabilir:

Youtube’dan bir kaç video ve Oynatma Listesi;

Hocam teşekkür ederim
Birde şunu öğrenebilir miyim; Like benzeri bir işlem pandas ta var mı

Like’tan kastınızı anlayamadım, açıklayabilir misiniz? Nedir Like?

Merhaba
Hocam kısmi benzerlilk arama. Makro ve SQL de kullanılıyor.
Veritabanında ‘gibi’ anlamına gelmektedir. Belirtilen şartlara uygun metinlerin bulunması için kullanılanılıyor.
Bir cümle içinden bir kaç hece yazarak arama yapmak

strName = “Mr. Michael James”
``

Daha sonra If ifadesinde Like operatörünü kullanırız :

If strName Like "Mr*" Then
    blnResult = True
Else
    blnResult = False
End If

Forumda sorunu Çözülmüş olarak işaretlediğin için, doğal olarak çözümün altına eklenen mesajlarda bu uyarı çıkıyor;

Bu konu çözüldü
Yalnızca şu durumlarda buraya yanıt verin:

  • Ek ayrıntılarınız varsa
  • Çözüm sizin için işe yaramıyorsa
    İlgisiz bir sorununuz varsa lütfen bunun yerine yeni bir konu başlatın.

Sorduğun şey aslında konu ile irtibatlı ancak yeni bir konu açarsan ve bu konuyu referans gösterirsen daha doğru olacağı kanaatindeyim.

Ayrıca, sorunu doğru anladıysam bir cevabım var. :slight_smile:

1 Beğeni