【问题标题】:Have data appear in first row only in one column of dataframe让数据仅出现在数据框的一列中的第一行
【发布时间】:2022-01-12 22:32:01
【问题描述】:

我有一列股票代码,我从该列中创建了一个以逗号分隔的符号字符串,该字符串被放置在同一数据框 DF 中名为 v1 的新列中。我还将逗号分隔的字符串带到了一个新的数据框 DF1。在这两种情况下,我只希望字符串出现在第 1 列中,而不是在每一列中。在这两个数据框中有什么方法可以让逗号分隔的符号字符串只出现在第一行而不在所有行中重复吗?如果可能的话,有人可以解释一下。谢谢

分隔的逗号字符串代码

v1 = df['Ticker'].tolist()
        v1 = ",".join(map(str,v1))
        df['v1'] = v1
        df1 = df[['v1']]
        print(df)
        print (df1)

当前 DF 输出

 No. Ticker  ... AH Change                                                 v1
    0    1   AAPL  ...         -  AAPL,MSFT,TSLA,FB,BRK-B,NVDA,TSM,JPM,V,JNJ,HD,...
    1    2   MSFT  ...         -  AAPL,MSFT,TSLA,FB,BRK-B,NVDA,TSM,JPM,V,JNJ,HD,...
    2    3   TSLA  ...         -  AAPL,MSFT,TSLA,FB,BRK-B,NVDA,TSM,JPM,V,JNJ,HD,...
    3    4     FB  ...         -  AAPL,MSFT,TSLA,FB,BRK-B,NVDA,TSM,JPM,V,JNJ,HD,...

当前 DF1 输出

    0   AAPL,MSFT,TSLA,FB,BRK-B,NVDA,TSM,JPM,V,JNJ,HD,...
    1   AAPL,MSFT,TSLA,FB,BRK-B,NVDA,TSM,JPM,V,JNJ,HD,...
    2   AAPL,MSFT,TSLA,FB,BRK-B,NVDA,TSM,JPM,V,JNJ,HD,...
    3   AAPL,MSFT,TSLA,FB,BRK-B,NVDA,TSM,JPM,V,JNJ,HD,...

所需的 DF 输出

   No. Ticker  ... AH Change                                                 v1
    0    1   AAPL  ...         -  AAPL,MSFT,TSLA,FB,BRK-B,NVDA,TSM,JPM,V,JNJ,HD,...
    1    2   MSFT  ...         -  
    2    3   TSLA  ...         -  
    3    4     FB  ...         -  

所需的 DF1 输出

    0   AAPL,MSFT,TSLA,FB,BRK-B,NVDA,TSM,JPM,V,JNJ,HD,...


    
    

完整代码

    import pandas as pd
    import requests
    import bs4
    import time
    import random
    
    
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
    
    def testDf(version):
        url = 'https://finviz.com/screener.ashx?v={version}&r={page}&f=sh_outstanding_o1000&c=0,1,2,3,4,5,6,7,71,72&f=ind_stocksonly&o=-marketcap'
    
        page = 1
    
        screen = requests.get(url.format(version=version, page=page), headers=headers)
        soup = bs4.BeautifulSoup(screen.text, features='lxml')
        pages = int(soup.find_all('a', {'class': 'screener-pages'})[-1].text)
    
        data = []
        for page in range(1, 1 * pages, 20):
            print(version, page)
            screen = requests.get(url.format(version=version, page=page), headers=headers).text
            tables = pd.read_html(screen)
            tables = tables[-2]
            tables.columns = tables.iloc[0]
            tables = tables[1:]
            data.append(tables)
            time.sleep(random.random())
        return pd.concat(data).reset_index(drop=True).rename_axis(columns=None)
    
    df = testDf('152').copy()
    
    
    v1 = df['Ticker'].tolist()
    v1 = ",".join(map(str,v1))
    df['v1'] = v1
    df1 = df[['v1']]
    print(df)
    print (df1)

【问题讨论】:

  • 查看pandas.DataFrame中的groupby函数。尝试按v1 列分组。
  • 嗨,它已经是我想要的格式了,我只是不希望它在每一行中重复。
  • 你只关心打印输出吗?
  • 不,我想将它用于股票代码以从 Internet 表中抓取数据。采用这种格式,appl、msft、tesl、amzn 会使其运行得更快。

标签: python web-scraping


【解决方案1】:
grouping = df.groupby('v1')

indices = []
for x in grouping.groups.values():
    indices.extend(x[1:])

df.loc[indices, 'v1'] = ''
df1 = pd.DataFrame(grouping.groups.keys())

注意:这会更改 df 并且是不可逆的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 2021-08-27
    • 1970-01-01
    • 2018-12-07
    • 2013-11-25
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多