【问题标题】:Appending to an empty data frame in Pandas using a for loop使用 for 循环附加到 Pandas 中的空数据框
【发布时间】:2019-07-12 08:03:25
【问题描述】:

我正在写作是因为我遇到了一个 for 循环的问题,该循环在数据帧为空时填充数据帧。不幸的是,Filling empty python dataframe using loopsAppending to an empty data frame in Pandas?Creating an empty Pandas DataFrame, then filling it? 的帖子并没有帮助我解决它。

我的尝试首先是在列表“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})

两个期望的结果应该是:

第一个数据帧应称为df_ap_1,而第二个数据帧应称为df_ap_3

提前致谢。

德里戈

【问题讨论】:

  • 什么是list_test_2?此外,这是很多数据帧。有没有机会将所有 16 个数据框组合成一个大数据框?也许您可以通过添加一个值为 'a'、'b'、'c' 或 'd' 的列,然后添加一个值为 'ap'、'di'、' 的列来做到这一点er_direct' 或 'er_s'。
  • 感谢您的回答。我已经更新了我的尝试。我忘记了 list_test_2 的定义。实际上,它们有很多数据框,但每个数据框只有几行。

标签: python pandas dataframe iteration


【解决方案1】:

这是一种方法:

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 中的行附加到空数据框。

【讨论】:

  • 嗨@LetEpsilonBeLessThanZero,感谢您的努力。恐怕这不是我想要的。请查看我刚刚附在这篇文章中的照片。我希望所有者依赖于 listDataframe。这就是我使用 zip 的原因。根据空数据框在 listDataframe 中的位置,它有不同的所有者。我希望我自己解释。 :)
  • 我明白了。我编辑了代码。我想这就是你想要的。
猜你喜欢
  • 2021-03-15
  • 2018-07-20
  • 2019-04-13
  • 2019-04-11
  • 1970-01-01
  • 2020-06-02
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多