当前位置: 首页 > 知识库问答 >
问题:

用循环中的行填充现有数据帧

柯波峻
2023-03-14

我试着学习如何从for循环构建和填充pandas数据帧?但我似乎无法将我的价值观写入我的专栏。

最终,我从一个网页中获取数据,并希望将其放入一个数据框中。

我的标题预定义为:

d1 = pd.DataFrame(columns=['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8', 'col9',
        'col10', 'col11', 'col12', 'col13', 'col14', 'col15', 'col16', 'col17'])

现在我有了在for循环中得到的值,如何将这些行写入每一列,然后重复到第1列到第17列,再重复到下一行?

row = soup.find_all('td', attrs = {'class': 'Table__TD'})
for data in row:
    print(data.get_text())

示例输出行1

Mon 11/11
SA
100
31
3-5
60.0
1-3
33.3
1-2
50.0
10
4
0
1
1
2
8

示例输出第2行

Wed 11/13
@CHA
W119-117
32
1-5
20.0
1-5
20.0
0-0
0.0
3
1
0
1
3
3
3

预期产量

任何帮助都将不胜感激。

共有3个答案

邵城
2023-03-14

将数据附加到现有数据帧的速度非常慢。

您最好从soup创建一个数据列表,创建一个新的数据框,然后将新的数据框合并到旧的数据框中

这是一个快速基准测试,对每个案例使用空的df。在您的实际代码中,df应该是您现有的数据帧:

# setup some sample data
headers = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 
           'col8', 'col9', 'col10', 'col11', 'col12', 'col13', 'col14',
           'col15', 'col16', 'col17']
raw_data = 'Mon 11/11,SA,100,31,3-5,60.0,1-3,33.3,1-2,50.0,10,4,0,1,1,2,8'.split(",")
row_dict_data = dict(zip(headers, raw_data))

# append
%%time
df = pd.DataFrame(columns=headers)
for i in range(100):
    df = df.append([row_dict_data])

# CPU times: user 258 ms, sys: 4.82 ms, total: 263 ms
# Wall time: 261 ms


# new dataframe
%%time
df = pd.DataFrame(columns=headers)
df2 = pd.DataFrame([raw_data for i in range(100)], columns=headers)
df3 = pd.concat([df, df2], sort=False)

# CPU times: user 7.03 ms, sys: 1.16 ms, total: 8.2 ms
# Wall time: 7.19 ms
冯宏浚
2023-03-14

首先,我们有列名称列表:

cols = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8', 'col9',
        'col10', 'col11', 'col12', 'col13', 'col14', 'col15', 'col16', 'col17']

然后列出值:

row = [x.get_text() for x in soup.find_all('td', attrs = {'class': 'Table__TD'})]
print(row)
# ['Mon 11/11', 'SA', '100', '31', '3-5', '60.0', '1-3', '33.3', '1-2', '50.0', '10', '4', '0', '1', '1', '2', '8']

然后我们可以将列和值压缩在一起,然后附加到数据帧:

d1 = d1.append(dict(zip(cols, row)), ignore_index=True)
print(d1)
#         col1 col2 col3 col4 col5  col6 col7  col8 col9 col10 col11 col12  \
# 0  Mon 11/11   SA  100   31  3-5  60.0  1-3  33.3  1-2  50.0    10     4   
# 
#   col13 col14 col15 col16 col17  
# 0     0     1     1     2     8
奚晟
2023-03-14

你可以试试这个,

import pandas as pd

columns = [
    'col1',
    'col2',
    'col3',
    'col4',
    'col5',
    'col6',
    'col7',
    'col8',
    'col9',
    'col10',
    'col11',
    'col12',
    'col13',
    'col14',
    'col15',
    'col16',
    'col17',
]

# create dataframe
d1 = pd.DataFrame(columns=columns)

full = []

for data in soup.find_all('td', attrs={'class': 'Table__TD'}):
    full.append(data.get_text())

# seperate full list into sub-lists with 17 elements
rows = [full[i: i+17] for i in range(0, len(full), 17)]

# append list of lists structure to dataframe
d1 = d1.append(pd.DataFrame(rows, columns=d1.columns))
 类似资料:
  • 我是不是误解了什么?据我所知,Julia中的Dataframes与R中的Dataframes的工作方式不同,但我无法全神贯注于如何使其工作。

  • 我试图对文本进行实体分析,我想把结果放在数据框中。目前,结果不存储在字典中,也不存储在数据框中。结果用两个函数提取。 df: 我有以下代码: 该代码给出了以下结果: 我已经在函数中创建了和一个数据框。这个线程解释了在循环中附加到数据帧是没有效率的。我不知道如何以有效的方式填充数据框。这些线程与我的问题相关,但它们解释了如何从存量数据填充数据框。当我尝试使用并返回时,我得到一个错误: 在entity

  • 我对JAVA非常陌生,我需要帮助获得某种嵌套循环,我认为这是一个用户输入,并将输入放入数组中。还有一个哨兵-1。我知道为别人做作业是不受欢迎的,而这根本不是我所要求的。我希望有人能帮我解释一下,而不是帮我写代码。我刚开始需要帮助。我搞不懂这个节目的第一部分: 我必须使用[4][5]的2D数组,其中4是销售人员的数量,5是他们销售的产品的数量。我必须向用户询问人名(1-4),然后再询问已售出的产品(

  • 我在NetBeans IDE中工作,语言是Java,主要的类是JFrame Form。 我需要从Jtable获取所有数据并用这些数据填充数组。数组代表矩阵。 代码如下 我有一个错误 线程“AWT-EventQueue-0”java.lang.ClassCastException:java.lang.String无法转换为java.lang.Double 所以将表中的元素设置为双精度不是那么容易吗?

  • series(string $value,[ string $categories]) string $value $config = ['path' => './tests']; ​ $fileObject = new \Vtiful\Kernel\Excel($config); ​ $fileObject = $fileObject->fileName('tutorial.xlsx'); $

  • factory 辅助函数 必须 使用 factory 方法来做数据填充,因为是框架提倡的,并且可以同时为测试代码服务。 运行效率 开发数据填充时,必须 特别注意 php artisan db:seed 的运行效率,否则随着项目的代码量越来越大,db:seed 的运行时间会变得越来越长,有些项目多达几分钟甚至几十分钟。 原则是: Keep it lighting speed. 只有当 db:seed