You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:24:09