【问题标题】:Pandas: append dataframe to another df熊猫:将数据框附加到另一个df
【发布时间】:2021-12-22 16:46:27
【问题描述】:

我在附加数据框时遇到问题。 我尝试执行这段代码

df_all = pd.read_csv('data.csv', error_bad_lines=False, chunksize=1000000)
urls = pd.read_excel('url_june.xlsx')
substr = urls.url.values.tolist()
df_res = pd.DataFrame()
for df in df_all:
    for i in substr:
        res = df[df['url'].str.contains(i)]
        df_res.append(res)

当我尝试保存 df_res 时,我得到了空数据框。 df_all 看起来像

ID,"url","used_at","active_seconds"
b20f9412f914ad83b6611d69dbe3b2b4,"mobiguru.ru/phones/apple/comp/32gb/apple_iphone_5s.html",2015-10-01 00:00:25,1
b20f9412f914ad83b6611d69dbe3b2b4,"mobiguru.ru/phones/apple/comp/32gb/apple_iphone_5s.html",2015-10-01 00:00:31,30
f85ce4b2f8787d48edc8612b2ccaca83,"4pda.ru/forum/index.php?showtopic=634566&view=getnewpost",2015-10-01 00:01:49,2
d3b0ef7d85dbb4dbb75e8a5950bad225,"shop.mts.ru/smartfony/mts/smartfon-smart-sprint-4g-sim-lock-white.html?utm_source=admitad&utm_medium=cpa&utm_content=300&utm_campaign=gde_cpa&uid=3",2015-10-01 00:03:19,34
078d388438ebf1d4142808f58fb66c87,"market.yandex.ru/product/12675734/spec?hid=91491&track=char",2015-10-01 00:03:48,2
d3b0ef7d85dbb4dbb75e8a5950bad225,"avito.ru/yoshkar-ola/telefony/mts",2015-10-01 00:04:21,4
d3b0ef7d85dbb4dbb75e8a5950bad225,"shoppingcart.aliexpress.com/order/confirm_order",2015-10-01 00:04:25,1
d3b0ef7d85dbb4dbb75e8a5950bad225,"shoppingcart.aliexpress.com/order/confirm_order",2015-10-01 00:04:26,9

urls 看起来像

url
shoppingcart.aliexpress.com/order/confirm_order
ozon.ru/?context=order_done&number=
lk.wildberries.ru/basket/orderconfirmed
lamoda.ru/checkout/onepage/success/quick
mvideo.ru/confirmation?_requestid=
eldorado.ru/personal/order.php?step=confirm

当我在循环中打印res 时,它不会为空。但是当我在追加后尝试循环打印df_res 时,它返回空数据帧。 我找不到我的错误。我该如何解决?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果你看the documentation for pd.DataFrame.append

    将其他行追加到此帧的末尾,返回一个新对象。不在此框架中的列将作为新列添加。

    (强调我的)。

    试试

    df_res = df_res.append(res)
    

    顺便提一下,pandas 在通过连续连接创建 DataFrame 方面效率不高。你可以试试这个:

    all_res = []
    for df in df_all:
        for i in substr:
            res = df[df['url'].str.contains(i)]
            all_res.append(res)
    
    df_res = pd.concat(all_res)
    

    这首先创建所有部分的列表,然后在最后从所有部分创建一个 DataFrame。

    【讨论】:

    • 感谢您的解释。有时df_res.append(res) 有效,但有时只有df_res = df_res.append(res) 有效。但是不知道为什么会这样
    • @PetrPetrov 您在交互式环境中工作吗?
    • +1 指出使用它在循环中连接多个数据帧的效率低下。我一直在代码中发现这一点,这让我发疯。
    【解决方案2】:

    如果我们想基于索引追加:

    df_res = pd.DataFrame(data = None, columns= df.columns)
    
    all_res = []
    
    d1 = df.ix[index-10:index-1,]     #it will take 10 rows before i-th index
    
    all_res.append(d1)
    
    df_res = pd.concat(all_res)
    

    【讨论】:

      猜你喜欢
      • 2019-10-22
      • 2018-02-08
      • 2017-06-13
      • 2014-01-03
      • 1970-01-01
      • 2020-11-04
      • 2019-01-14
      • 2018-08-27
      相关资源
      最近更新 更多