Присоединение к пустому фрейму данных в Pandas с помощью цикла for - PullRequest
0 голосов
/ 19 февраля 2019

Я пишу, потому что у меня проблема с циклом for, который заполняет фрейм данных, когда он пуст.К сожалению, сообщения Заполнение пустого фрейма данных Python с использованием циклов , Присоединение к пустому фрейму данных в Pandas? , Создание пустого фрейма данных Pandas с последующим заполнением? не поможет мне решить это.

Моя попытка направлена ​​на то, чтобы сначала найти пустые кадры данных в списке «listDataframe», а затем заполнить их выбранными столбцами.Я считаю, что мой код яснее, чем мое объяснение.Что я не могу сделать, это сохранить новый фрейм данных, используя его оригинальное имя.Вот моя попытка:

for k,j in zip(listOwner,listDataframe):
for y in j:
    if y.empty:
        data = pd.DataFrame({"Event Date": list_test_2, "Site Group Name" : k, "Impressions" : 0})
        y = pd.concat([data,y])
        #y = y.append(data)

, где "listOwner", "listDataframe" и "list_test_2", соответственно, определяются как:

listOwner = ['OWNER ONE', 'OWNER TWO', 'OWNER THREE', 'OWNER FOUR']
listDataframe = [df_a,df_b,df_c,df_d]

с

df_a = [df_ap_1, df_di_1, df_er_diret_1, df_er_s_1]
df_b = [df_ap_2, df_di_2, df_er_diret_2, df_er_s_2]
df_c = [df_ap_3, df_di_3, df_er_diret_3, df_er_s_3]
df_d = [df_ap_4, df_di_4, df_er_diret_4, df_er_s_4]

и

list_test_2 = []
for i in range(1,8):
    f = (datetime.today() - timedelta(days=i)).date()
    list_test_2.append(datetime.combine(f, datetime.min.time()))

Пустым фреймом данных были df_ap_1 и df_ap_3.После запуска вышеуказанных строк (используя concat и append), если я вызываю эти два кадра данных, они все еще пусты.Любая идея, почему это происходит и как преодолеть эту проблему?

ОБНОВЛЕНИЕ

Чтобы избежать как добавления, так и конкат, я попытался использовать предстоящую попытку (опять-таки безуспешно).

for k,j in zip(listOwner,listDataframe):
    for y in j:
        if y.empty:
            y = pd.DataFrame({"Event Date": list_test_2, "Site Group Name" : k, "Impressions" : 0})

Два желаемых результата должны быть:

enter image description here

, где первый кадр данных должен называться df_ap_1, а второйодин df_ap_3.

Заранее спасибо.

Дриго

1 Ответ

0 голосов
/ 19 февраля 2019

Вот способ сделать это:

import pandas as pd

columns = ['Event Date', 'Site Group Name', 'Impressions']
df_ap_1 = pd.DataFrame(columns=columns) #empty dataframe
df_di_1 = pd.DataFrame(columns=columns) #empty dataframe
df_ap_2 = pd.DataFrame({'Event Date':[1], 'Site Group Name':[2], 'Impressions': [3]}) #non-empty dataframe
df_di_2 = pd.DataFrame(columns=columns) #empty dataframe

df_a = [df_ap_1, df_di_1]
df_b = [df_ap_2, df_di_2]
listDataframe = [df_a,df_b]

list_test_2 = 'foo'
listOwner = ['OWNER ONE', 'OWNER TWO']

def appendOwner(df, owner, list_test_2):
    #appends a row to a dataframe for each row in listOwner
    new_row = {'Event Date': list_test_2,
               'Site Group Name': owner,
               'Impressions': 0,
               }
    df.loc[len(df)] = new_row

for owner, dfList in zip(listOwner, listDataframe):
    for df in dfList:
        if df.empty:
            appendOwner(df, owner, list_test_2)

print(listDataframe)

Вы можете использовать функцию appendOwner, чтобы добавить строки из listOwner в пустой фрейм данных.

...