【发布时间】: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