たとえば、一連の文字列を返すforループを持つ関数があります。
58、冥王星172、ウノ5、桃
pandasデータフレームの1つの列の文字列の最初の部分(数値)と2番目の列の2番目の部分(果物)を取得するにはどうすればよいですか。列には「amount」と「fruit」という名前を付ける必要があります。
これまでのコードは次のとおりです。
regex = r"(\d+)( ML/year )(in the |the )([\w \/\(\)]+)"
for line in finalText.splitlines():
matches = re.finditer(pattern, line)
for matchNum, match in enumerate(matches, start=1):
print (match.group(1) +","+ match.group(4))
reを使用して、大きなテキストブロックから必要なデータを除外していますが、今のところ、コンソールに出力するだけで、データフレームに入れる必要があります。
基本的に、そのコードの最後のprintステートメントを変更する必要があるため、印刷する代わりにデータフレームに挿入します。
最終的なテキストの例は次のとおりです。
(a)ナシ地域で58 ML / Y(b)リンゴ地域で64 ML / Y
プレーンテキストです
あなたのためのより簡単な解決策を考え出すことに取り組む必要がありました。\ W正規表現を使用して、文字列から()\を削除します。
あなたの文字列のパターンが常になる場合
(x)## ML/Y in the fruit region (y) ## ML/Y in the fruit region
次に、このコードを使用します。リストから()\を削除し、より簡単なリストを提供します。リストの3番目、8番目、13番目、18番目の位置を使用して、必要なものを取得します。
import pandas as pd
import re
finalText = '(a)58 ML/Y in the pear region (b) 64 ML/Y in the apple region'
df = pd.DataFrame(data=None, columns=['amount','fruit'])
for line in finalText.splitlines():
matches = re.split(r'\W',line)
df.loc[len(df)] = [matches[2],matches[7]]
df.loc[len(df)] = [matches[12],matches[17]]
print(df)
この結果、次のようになりました。
amount fruit
0 58 pear
1 64 apple
これを行う別の方法は、findallを使用することです。
for line in finalText.splitlines():
print (line)
m = re.findall(r'\w+',line)
print (m)
matches = re.findall(r'\w+',line)
df.loc[len(df)] = [matches[1],matches[6]]
df.loc[len(df)] = [matches[9],matches[14]]
print(df)
上記と同じ結果
amount fruit
0 58 pear
1 64 apple
古いコード
これを試して、うまくいくかどうか教えてください。
import pandas as pd
df = pd.DataFrame(data=None, columns=['amount','fruit'])
regex = r"(\d+)( ML/year )(in the |the )([\w \/\(\)]+)"
for line in finalText.splitlines():
matches = re.finditer(pattern, line)
for matchNum, match in enumerate(matches, start=1):
df[matchNum] = [match.group(1) , match.group(4)]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加