【问题标题】:filling existing dataframe with rows from loop用循环中的行填充现有数据框
【发布时间】:2020-03-08 20:04:17
【问题描述】:

我尝试过 How to build and fill pandas dataframe from for loop?,但似乎无法将我的值写入我的列。

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

我的标题预定义为:

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

预期输出

任何帮助将不胜感激。

【问题讨论】:

  • 行有什么? @excelguy
  • 我会支持@Vishnudev 所说的。我们需要更多信息,包括代码、数据来源等。请参阅:minimal reproducible example
  • d1.loc[len(d1), col_name] = value 但使用循环将值放入 dataframe 听起来真的很糟糕。我建议你在更大的问题上发布一个新问题,将数据输入dataframe,这样人们就可以看看它是否可以在没有循环的情况下完成。
  • 添加了详细信息,希望对您有所帮助。

标签: python pandas


【解决方案1】:

你可以试试这个,

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))

【讨论】:

  • 在我的 ide 中我得到了未定义的名为“soups”。但是当我运行代码时我得到ValueError: Length mismatch: Expected axis has 0 elements, new values have 17 elements
  • 我编辑了我的答案。请问还能和我一起喝汤吗?
  • 我写了soups 是因为您可能拥有多个soup。这就是我所说的迭代。
  • 嘿,我没有汤,但我有这个,row = soup.find_all('td', attrs = {'class': 'Table__TD'}) for data in row: print(data.get_text()) 这得到了我想附加到每一列的数据。这有帮助吗?
  • 我再次更新了我的答案。你能再检查一下吗?
【解决方案2】:

将数据附加到现有的 DataFrame 真的很慢。

您最好从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

【讨论】:

    【解决方案3】:

    首先我们有列名列表:

    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
    

    【讨论】:

    • 这可能是一个不错的选择,因为我的标题将保持静态。问题:如何迭代我的漂亮汤,就好像我继续运行我的代码一样,它一次又一次地附加同一行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2012-11-06
    • 1970-01-01
    • 2015-05-08
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多