質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

720閲覧

list 型(もしくはSeries型)にしているデータを新規行でDataFrame型にするには【appendの仕方がわかりません】

tomote1

総合スコア12

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/05/26 04:51

編集2021/05/26 08:05

前提・実現したいこと

私用の勉強目的で
レシート画像データを複数枚OCRで読み取って
いくつか正規表現のパターンをつくって 日付・税額表示データをリストへ取得、
DataFrame へ改行しながらデータを格納していくプログラムをPythonで実現したい

  辞書形式で枠を以下のように作ってみました
data = {'日付1': str01, '日付2': str02, '日付3':str03, '8%':str04, '10%': str05}

元の画像から読み取ったテキストは以下
【精度ひくいのでごちゃごちゃしています、場所が特定できるような情報、電話番号などは削除しています】

""

領 収 証

2021年04月17日(土)12:35 ゆび0634

No04300106野地
裁録機 0133 登録No8864
※サントリー天然水ケース 398
ハミング消臭ジャス詰替 \168
*みず菜 \100
*日清焼そばソース付3人 \89
ばれいしょ \298

A* 宮城県産ひとめぼれ5 k \1.499 軒
昌 小計 \2.552 較

則 (外8% 対象 \2, 384)

| 分8 \190
-和 (外10% 対象 \168)
( | 外10 \16

支払合計 デジ 。 アロ
人凍

に XXXXXXXXXXXX

ン LaCuCa残高 \3. 313

下| *印は軽減税率(8%)適用の商品です
ーーー----- L6ノ LaCUOa --ー--ニニニニニ=
|ポト対象金額
今回取引人選ト
LaCuCa決済P対象金額
LaCuCa決済P

""

発生している問題・エラーメッセージ

(パターンA)こちらのサイトの「異なる長さのリストを含む辞書をpd.DataFrameに変換(追記 (より良い方法))」を参考にしながら https://qiita.com/ShoheiKojima/items/30ee0925472b7b3e5d5c  そのあとappendでDataFrameに行ごとに追加できると思ったのですが  ここからのappendの仕方が分かりません。 List化したところから Series型に変換、  空のデータフレームをつくり Series型データをAppendしていくようにしてみるパターン(パターンB)も  作ってみましたが 改行されずに 単に横に連なるデータが作成されただけでした。  自分でいろいろ試してみたのですが  知識が足らず おもったように(データフレームに行別に出力)なりません。  修正方法お分かりになる方がいらっしゃいましたら  お知恵をかりたく思います、よろしくお願いいたします。

該当のソースコード

Python

1import pytesseract 2import pyocr.builders 3import re 4import pathlib as path 5import pandas as pd 6 7 8tess.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' 9 10builder = pyocr.builders.TextBuilder(tesseract_layout=3) 11 12for image in images: 13 with open(image, 'rb') as file: 14 img = Image.open(file) 15 txt01 = tool.image_to_string(img, lang="jpn", builder=builder) 16 17 str01 = re.findall(r'\d*年\d*月\d*日', txt01) 18 str02 = re.findall(r'\d*年\s\d月\s\d*日', txt01) 19 str03 = re.findall(r'\d*年\s\d月\d*日', txt01) 20 str04 = re.findall(r'外8%\s対象\s*\D\d\D\s\d*', txt01) 21 str05 = re.findall(r'外10%\D*\d*', txt01) 22 23 24 data = {'日付1': str01, '日付2': str02, '日付3':str03, '8%':str04, '10%': str05} 25 df = pd.DataFrame(data.values(), index=data.keys()).T 26 27 28 29

試したこと(パターンB)

 別の方法で改行\nを追加して appendしたほうが通るかと思い

list型で空のリストを作成し
for image in images:
with open(image, 'rb') as file:
img = Image.open(file)
txt01 = tool.image_to_string(img, lang="jpn", builder=builder)

str01 = re.findall(r'\d*年\d*月\d*日', txt01) li01.append(str01) str02 = re.findall(r'\d*年\s\d月\s\d*日', txt01) li01.append(str02) str03 = re.findall(r'\d*年\s\d月\d*日', txt01) li01.append(str03) str04 = re.findall(r'外8%\s対象\s*\D\d\D\s\d*', txt01) li01.append(str04) str05 = re.findall(r'外10%\D*\d*', txt01) li01.append(str05) str06 = "\n" li01.append(str06)

 として動かし

li01
結果
[['2021年04月17日'],
[],
[],
['外8% 対象 \2, 384'],
['外10% 対象 \168'],
'\n',
[],
['2021年 4月 9日'],
[],
[],
[],
'\n']

となったところでシリーズ型に変換しデータフレームへ追加を行ってもみましたが

DF01 = pd.DataFrame([])
_df = pd.Series(li01)
_df = _df.append(_df, ignore_index= True)
pd.DataFrame(_df).T

結果横に伸びるだけでした

\nで改行できるかと思ったのですが…

【下記は2枚のレシートを読み込んでDataFrame.Tをこころみた後の結果】
イメージ説明

最終想定データ
イメージ説明

補足情報(FW/ツールのバージョンなど)

windows10
Python 3.8
pandas 1.2.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

先ほど もう一度自分で考え直してみて以下を追記し解決できたようです、
お答えいただきましたppaul様 ありがとうございました

● 空のデータフレーム _df

For文内に追加
● 取得した各文字列を格納する変数を整列させたリスト型list01

● リスト型list01をSeries型へ変更

● _df へ行を追加するためのappend文

_df = pd.DataFrame()

for image in images:
with open(image, 'rb') as file:
img = Image.open(file)
txt01 = tool.image_to_string(img, lang="jpn", builder=builder)
print(txt01)

str01 = re.findall(r'\d*年\d*月\d*日', txt01) str02 = re.findall(r'\d*年\s\d月\s\d*日', txt01) str03 = re.findall(r'\d*年\s\d月\d*日', txt01) str04 = re.findall(r'外8%\s対象\s*\D\d\D\s\d*', txt01) str05 = re.findall(r'外10%\D*\d*', txt01) list01 = [str01, str02, str03, str04, str05] mySr = pd.Series(list01) _df = _df.append(mySr, ignore_index= True)

List > Series > dfへappend後

(横並びに各々の情報を整列する方法は解決したようですが
[] かっこを表示したくないので今後の修正事項とします・・・)

投稿2021/05/26 11:43

tomote1

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

最終目的は読み取れませんので、縦方向のDataFrameにする方法だけ書いておきます。

python

1>>> print(li01) 2[['2021年04月17日'], [], [], ['外8% 対象 \2, 384'], ['外10% 対象 \168'], '\n', [], ['2021年 4月 9日'], [], [], [], '\n'] 3>>> DF01 = pd.DataFrame([li01]).T 4>>> print(DF01) 5 0 60 [20210417] 71 [] 82 [] 93 [8% 対象 \2, 384] 104 [10% 対象 \168] 115 \n 126 [] 137 [202149] 148 [] 159 [] 1610 [] 1711 \n

または、

python

1>>> DF02 = pd.DataFrame(li01[:-1]) 2>>> DF02 3 0 40 2021041751 None 62 None 738% 対象 \2, 384 8410% 対象 \168 95 \n 106 None 117 202149128 None 139 None 1410 None

投稿2021/05/26 07:37

編集2021/05/26 07:41
ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomote1

2021/05/26 08:02

回答誠にありがとうございます、 縦か横の一列か一行にデータが累積してしまうので どうにか\nのところでデータを分けてそれぞれ別データとして取り出して並ばせたいのですが アプローチの方法がまずいでしょうか・・? (本文を編集して想定しております最終目的のデータ画像を簡単に作成し張り付けてみました 参考いただければと思います)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問