【问题标题】:Extract letters after $ symbol using Pandas使用 Pandas 提取 $ 符号后的字母
【发布时间】:2021-09-29 18:05:29
【问题描述】:

我正在尝试仅从电子表格中提取数据,包括 $ 符号。

我已经隔离了数据,只为我提供了包含数据的列,但我想要做的是提取 $ 符号后面的所有符号。

例如: 整个数据集中的 $AAPL $LOW $TSLA 等等,但我不需要或不想要 $1000 $600 等等 - 只有字母,后面跟着一个句点或一个空格,但只有字符 az 是我想要得到的.

我在完全提取方面没有成功,而且我的代码开始变得混乱,所以我将提供可以带回数据的代码供您自己查看。我正在使用 Jupyter Notebook。

import mysql.connector
import pandas

googleSheedID = '15fhpxqWDRWkNtEFhi9bQyWUg8pDn4B-R2N18s1xFYTU'
worksheetName = 'Sheet1'
URL = 'https://docs.google.com/spreadsheets/d/{0}/gviz/tq?tqx=out:csv&sheet={1}'.format(
        googleSheedID,
        worksheetName
)

df = pandas.read_csv(URL)
del df['DATE']
del df['USERNAME']
del df['LINK']
del df['LINK2']
df[df["TWEET"].str.contains("RT")==False]

print(df)

【问题讨论】:

  • 您从未将df[df["TWEET"].str.contains("RT")==False] 分配给变量
  • 如果您发布一个小的相关数据样本会更好,这样我们就不需要下载您的电子表格,据我们所知,该电子表格可能包含数千行。
  • 如果数据像 $LOW6 $APP6L 等,你也想要它们吗?

标签: python dataframe jupyter data-extraction


【解决方案1】:

不确定我是否正确理解您想要的内容,但以下代码给出了 $ 之后 之前的所有元素(空格)。

import mysql.connector
import pandas

googleSheedID = '15fhpxqWDRWkNtEFhi9bQyWUg8pDn4B-R2N18s1xFYTU'
worksheetName = 'Sheet1'
URL = 'https://docs.google.com/spreadsheets/d/{0}/gviz/tq?tqx=out:csv&sheet={1}'.format(
        googleSheedID,
        worksheetName
)

df = pandas.read_csv(URL)
del df['DATE']
del df['USERNAME']
del df['LINK']
del df['LINK2']

unique_results = []
for i in range(len(df['TWEET'])):
    if 'RT' in df["TWEET"][i]:
        continue
    else:
        for j in range(len(df['TWEET'][i])-1):
            if df['TWEET'][i][j] == '$':
                if df['TWEET'][i][j+1] == '1' or df['TWEET'][i][j+1] == '2' or df['TWEET'][i][j+1] == '3' or\
                   df['TWEET'][i][j+1] == '4' or df['TWEET'][i][j+1] == '5' or df['TWEET'][i][j+1] == '6' or\
                    df['TWEET'][i][j+1] == '7' or df['TWEET'][i][j+1] == '8' or df['TWEET'][i][j+1] == '9' or df['TWEET'][i][j+1] == '0':
                        continue
                else:
                    start = j
                    for k in range(start, len(df['TWEET'][i])):
                        if df['TWEET'][i][k] == ' ' or df['TWEET'][i][k:k+1] == '\n':
                            end = k
                            break
                    results = df['TWEET'][i][start:end]
                    if results not in unique_results:
                        unique_results.append(results)
print(unique_results)
                        

编辑:修复代码

输出是:

['$GME', '$SNDL', '$FUBO', '$AMC', '$LOTZ', '$CLOV', '$USAS', '$AIHS', '$PLM', '$LODE', '$TTNP', '$IMTE', '', '$NAK.', '$NAK', '$CRBP', '$AREC', '$NTEC', '$NTN', '$CBAT', '$ZYNE', '$HOFV', '$GWPH', '$KERN', '$ZYNE,', '$AIM', '$WWR', '$CARV', '$VISL', '$SINO', '$NAKD', '$GRPS', '$RSHN', '$MARA', '$RIOT', '$NXTD', '$LAC', '$BTC', '$ITRM', '$CHCI', '$VERU', '$GMGI', '$WNBD', '$KALV', '$EGOC', '$Veru', '$MRNA', '$PVDG', '$DROP', '$EFOI', '$LLIT', '$AUVI', '$CGIX', '$RELI', '$TLRY', '$ACB', '$TRCH', '$TRCH.', '$TSLA', '$cciv', '$sndl', '$ANCN', '$TGC', '$tlry', '$KXIN', '$AMZN', '$INFI', '$LMND', '$COMS', '$VXX', '$LEDS', '$ACY', '$RHE', '$SINO.', '$GPL', '$SPCE', '$OXY', '$CLSN', '$FTFT', '$FTFT.....', '$BIEI', '$EDRY', '$CLEU', '$FSR', '$SPY', '$NIO', '$LI', '$XPEV,', '$UL', '$RGLG', '$SOS', '$QS', '$THCB', '$SUNW', '$MICT', '$BTC.X', '$T', '$ADOM', '$EBON', '$CLPS', '$HIHO', '$ONTX', '$WNRS', '$SOLO', '$Mara,', '$Riot,', '$SOS,', '$GRNQ,', '$RCON,', '$FTFT,', '$BTBT,', '$MOGO,', '$EQOS,', '$CCNC', '$CCIV', '$tsla', '$fsr', '$wkhs', '$ride', '$nio', '$NETE', '$DPW', '$MOSY', '$SSNT', '$PLTR', '$GSAH:', '$EQOS', '$MTSL', '$CMPS', '$CHIF', '$MU', '$HST', '$SNAP', '$CTXR', '$acy', '$FUBOTV', '$DPBE', '$HYLN', '$SPOT', '$NSAV', '$HYLN,', '$aabb', '$AAL', '$BBIG', '$ITNS', '$CTIB', '$AMPG', '$ZI', '$NUVI', '$INTC', '$TSM', '$AAPL', '$MRJT', '$RCMT', '$IZEA', '$BBIG,', '$ARKK', '$LIAUTO', '$MARA:', '$SOS:', '$XOM', '$ET', '$BRNW', '$SYPR', '$LCID', '$QCOM', '$FIZZ', '$TRVG', '$SLV', '$RAFA', '$TGCTengasco,', '$BYND', '$XTNT', '$NBY', '$sos', '$KMPH', '$', '$(0.60)', '$(0.64)', '$BIDU', '$rkt', '$GTT', '$CHUC', '$CLF', '$INUV', '$RKT', '$COST', '$MDCN', '$HCMC', '$UWMC', '$riot', '$OVID', '$HZON', '$SKT', '$FB', '$PLUG', '$BA', '$PYPL', '$PSTH.', '$NVDA', '$AMPG.', '$aese.', '$spy', '$pltr', '$MSFT', '$AMD', '$QQQ', '$LTNC', '$WKHS', '$EYES', '$RMO', '$GNUS', '$gme', '$mdmp', '$kern', '$AEI', '$BABA', '$YALA', '$TWTR', '$WISH', '$GE', '$ORCL', '$JUPW', '$TMBR', '$SSYS', '$NKE', '$AMPGAmpliTech', '$$$', '$$', '$RGLS', '$HOGE', '$GEGR', '$nclh', '$IGAC', '$FCEL', '$TKAT', '$OCG', '$YVR', '$IPDN.', '$IPDN', "$SINO's", '$WIMI', '$TKAT.', '$BAC', '$LZR', '$LGHL', '$F', '$GM', '$KODK', '$atvk', '$ATVK', '$AIKI', '$DS', '$AI', '$WTII', '$oxy', '$DYAI', '$DSS', '$ZKIN', '$MFH', '$WKEY', '$MKGI', '$DLPN', '$PSWW', '$SNOW', '$ALYA', '$AESE', '$CSCW', '$CIDM', '$HOFV.', '$LIVX', '$FNKO', '$HPR', '$BRQS', '$GIGM', '$APOP', '$EA', '$CUEN', '$TMBR?', '$FLNT,', '$APPS', '$METX', '$STG', '$WSRC', '$AMHC', '$VIAC', '$MO', '$UAVL', '$CS', '$MDT', '$GYST', '$CBBT', '$ASTC', '$AACG', '$WAFU.', '$WAFU', '$CASI', '$mmmw', '$MVIS', '$SNOA', '$C', '$KR', '$EWZ', '$VALE', '$EWZ.', '$CSCO', '$PINS', '$XSPA', '$VPRX', '$CEMI', '$M', '$BMRA', '$SPX', '$akt', '$SURG', '$NCLH', '$ARSN', '$ODT', '$SGBX', '$CRWD.', '$TGRR', '$PENN', '$BB', '$XOP', '$XL', '$FREQ', '$IDRA', '$DKNG', '$COHN', '$ADHC', '$ISWH', '$LEGO', '$OTRA', '$NAAC', '$HCAR', '$PPGH', '$SDAC', '$PNTM', '$OUST', '$IO', '$HQGE', '$HENC', '$KYNC', '$ATNF', '$BNSO', '$HDSN', '$AABB', '$SGH', '$BMY', '$VERY', '$EARS', '$ROKU', '$PIXY', '$APRE', '$SFET', '$SQ', '$EEIQ', '$REDU', '$CNWT', '$NFLX', '$RGBPP', '$RGBP', '$SHOP', '$VITL', '$RAAS', '$CPNG', '$JKS', '$COMP', '$NAFS']

【讨论】:

  • 这很好用,谢谢。我将如何做到这一点,因为我只有独特的结果存在?我一直在玩 .unique() 但我想我可能需要将它分配给一个变量?
  • 独特结果是什么意思?对不起,我对编程术语的理解非常有限......
  • 如果可能,结果中只返回一个实例。例如,$AIHS 出现了两次,许多其他的也出现了。
  • 我尝试使用np.unique,但它会按字母顺序对列表进行排序。这不是问题吗?
  • 排序是完美的,我只需要结果。谢谢你 - 我会在周末运行代码来测试它,但从这里看起来很棒!
【解决方案2】:

您可以使用正则表达式。

\$[a-zA-Z]+

阅读df后执行以下代码

import re
# Create Empty list for final results
results = []
final_results = []
for row_num in range(len(df['TWEET'])):
    string_to_check = df['TWEET'][row_num]
    # Check for RT at the beginning of the string only.
    # if 'RT' in df["TWEET"][row_num] would have found the "RT" anywhere in the string.
    if re.match(r"^RT", string_to_check):
        continue
    else:
        # Check for all words starting with $ and followed by only alphabets.
        # This will find $FOOBAR but not $600, $6FOOBAR & $FOO6BAR
        rel_text_l = re.findall(r"\$[a-zA-Z]+", string_to_check)
        # Check for empty list
        if rel_text_l:
            # Add elements of list to another list directly
            results.extend(rel_text_l)

# Making list of the set of list to remove duplicates
final_results = list(set(results))
print(results)
print(final_results)

结果

['$GME', '$FOOBAR', '$FOO', '$SNDL', '$FUBO', '$AMC', '$GME', '$LOTZ', '$CLOV', '$USAS', '$GOBLIN', '$LTNC']
['$LTNC', '$GOBLIN', '$AMC', '$FOO', '$FOOBAR', '$LOTZ', '$CLOV', '$SNDL', '$GME', '$USAS', '$FUBO']

注意$GMEfinal_results 中被删除一次

如果您不介意删除以RT 开头的推文,这一切都可以在一行代码中实现。

direct_result = list(set(re.findall(r"\$[a-zA-Z]+", str(df['TWEET']))))

【讨论】:

  • 我能够从之前的海报中获得我的解决方案,但感谢您为我提供答案。您发布的正则表达式看起来要短得多。我很想知道您如何将它应用到我发布的初始代码中,以帮助我了解它的放置位置。
  • 请查看编辑。 Karina 提出的答案将处理$6FOOBAR,而不是$FOO6BAR。它还一一循环遍历字符串的所有字符以检查数字、空格和换行符。我还没有计时,但我认为代码也需要更多时间来执行。
猜你喜欢
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2022-09-24
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 2023-01-20
相关资源
最近更新 更多