Python中DataFrame以Date列为首列时print仅显示首行求助
问题描述
我是Python初学者,使用pytesseract识别图片后通过pandas创建DataFrame时遇到异常:当将Date列设为第一列时,执行print(df)仅显示第一行;但调整列顺序将Date列放在其他位置时,能正常显示全部行。希望保留Date为首列并显示所有行,恳请告知原因及解决办法。
相关代码示例
Date列为首列时(仅显示第一行)
df['Date'] = pd.Series(date_date) df['In'] = pd.Series(float_in) df['Out'] = pd.Series(float_out) df['Date'] = df['Date'].fillna(date_date) df['Out'] = df['Out'].fillna(0) df['In'] = df['In'].fillna(0) print(df) # 输出结果 Date In Out 0 2022-05-31 0.0 7700.0
Date列非首列时(显示全部行)
df['In'] = pd.Series(float_in) df['Out'] = pd.Series(float_out) df['Date'] = pd.Series(date_date) df['Date'] = df['Date'].fillna(date_date) df['Out'] = df['Out'].fillna(0) df['In'] = df['In'].fillna(0) print(df) # 输出结果 In Out Date 0 0.0 7700.0 2022-05-31 1 0.0 4232.0 2022-05-31 2 0.0 16056.0 2022-05-31 3 0.0 80000.0 2022-05-31 4 0.0 40000.0 2022-05-31 5 0.0 105805.0 2022-05-31 6 0.0 185500.0 2022-05-31 7 0.0 52188.0 2022-05-31
原因分析
核心问题在于**date_date是单个datetime对象,而非与In/Out列长度匹配的序列**:
- 当先创建Date列时,
pd.Series(date_date)会生成仅含1个元素的Series,此时DataFrame的行数被固定为1。后续添加In、Out列时,pandas只会保留索引匹配的行(即第0行),多余的元素会被自动丢弃,最终只显示1行数据。 - 当先创建In、Out列时,DataFrame的行数由这两个列的长度决定(示例中为8行)。之后添加Date列时,单个
datetime对象会被pandas自动广播填充到所有行,因此能显示完整数据。
解决办法
只要保证Date列的长度与其他列一致,再调整列顺序即可实现Date为首列且显示全部行,以下是几种可行方案:
方案1:直接广播赋值(最简)
无需用pd.Series包裹单个日期,直接赋值时pandas会自动将单个值填充到所有行,最后调整列顺序:
df = pd.DataFrame() df['In'] = float_in df['Out'] = float_out df['Date'] = date_date # 单个值自动广播至所有行 # 调整列顺序,将Date移至首位 df = df[['Date', 'In', 'Out']]
方案2:生成匹配长度的日期序列
将单个日期转换为与In/Out列长度一致的列表,再创建Date列:
# 生成与float_in长度相同的日期序列 date_series = pd.Series([date_date] * len(float_in)) df = pd.DataFrame({ 'Date': date_series, 'In': float_in, 'Out': float_out })
方案3:先创建全量DataFrame再重排列
先按任意顺序创建包含所有列的DataFrame,最后通过列名列表重排顺序:
df = pd.DataFrame({ 'In': float_in, 'Out': float_out, 'Date': date_date # 自动广播 }) # 填充缺失值 df['Out'] = df['Out'].fillna(0) df['In'] = df['In'].fillna(0) # 重排列顺序,Date为首列 df = df[['Date', 'In', 'Out']]
修正后的完整代码
import cv2 import pytesseract import pandas as pd from datetime import datetime pytesseract.pytesseract.tesseract_cmd=r'C:\Program Files\Tesseract-OCR\tesseract.exe' # 注意路径前加r避免转义问题 img = cv2.imread(r"C:\Users\Fast Computer\Documents\Python test\Images\page-0.png") thresh = 255 #Coordinates and ROI for Amount Out x3,y3,w3,h3 = 577, 495, 172, 815 ROI_3 = img[y3:y3+h3,x3:x3+w3] #Coordinates and ROI for Amount In x4,y4,w4,h4 = 754, 495, 175, 815 ROI_4 = img[y4:y4+h4,x4:x4+w4] #Coordinates and ROI for Date x5,y5,w5,h5 = 833, 174, 80, 22 ROI_5 = img[y5:y5+h5,x5:x5+w5] #OCR and convert to strings text_amount_out = pytesseract.image_to_string(ROI_3) text_amount_in = pytesseract.image_to_string(ROI_4) text_date = pytesseract.image_to_string(ROI_5) text_amount_out = text_amount_out.replace(',', '') text_amount_in = text_amount_in.replace(',', '') cv2.waitKey(0) cv2.destroyAllWindows() #Convert Strings to Lists list_amount_out = text_amount_out.split() list_amount_in = text_amount_in.split() list_date = text_date.split() float_out = [] for item in list_amount_out: float_out.append(float(item)) float_in = [] for item in list_amount_in: float_in.append(float(item)) date_date = datetime.strptime(text_date, '%d/%m/%Y ') #Creating columns df = pd.DataFrame() df['In'] = float_in df['Out'] = float_out df['Date'] = date_date # 自动广播填充所有行 # 填充缺失值 df['Out'] = df['Out'].fillna(0) df['In'] = df['In'].fillna(0) # 调整列顺序,Date设为第一列 df = df[['Date', 'In', 'Out']] print(df)
内容的提问来源于stack exchange,提问作者OpK
相关产品推荐
相关产品推荐

