我有一个简短的脚本,它是使用"pandas>=0.25.3"
编写的应用程序的减少,该脚本已升级为"pandas==1.1.5"
最新版本的代码。在此版本的 Pandas 中,默认引擎不解析 xlsx,因此我们添加了engine="openpyxl"
。但是,有一个新问题。read_excel
似乎不再尊重names
论点,行为怪异。
import pandas
filename = "... .xlsx"
names = ["foo", "bar", "baz"]
data_frame = pandas.read_excel(
filename,
header=None,
names=names,
engine="openpyxl",
skiprows=3,
sheet_name=0,
)
print(data_frame.iloc[3])
使用新的熊猫运行脚本,我得到以下输出:
foo NaN
bar NaN
baz NaN
Name: (FxK2,SMin, 2066.125), dtype: float64
但是以前在默认情况下使用 xlrd 引擎解析的 pandas-0.25.3 中,我得到了我所期望的:
foo FxK2
bar SMin
baz 2066.125
names
字段为列命名,然后我可以引用data_frame.iloc[0].baz
并获取2066.125
。现在由于某种原因,整个事情最终出现在数据框的可选名称字段中。
我怎样才能获得我习惯的行为,这可能是一个错误还是只是我不习惯的新界面?pandas-1.1.5 似乎引用了names
参数,就像我习惯使用它一样。
更新(在评论线程之后):
使用engine='openpyxl'
时,第二个 excel 文件遇到了同样的问题。不过,与engine='xlrd'
一起阅读时,我没有遇到问题。但这可能是与xlrd
版本相关的问题,因为我使用的是旧版本"1.2.0"(目前是 2.0.1),并且 xlrd 文档中有一个很大的警告,说它不再读取除.xls文件以外的任何内容。
因此,正如我们在注释中所讨论的,使用engine='openpyxl'
的一个可能的解决方法是 指定列usecols=range(3)
,尽管它需要事先了解文件中的列。问题可能出在这些"空"单元格中的某些隐藏格式/样式/等。
例如,在同一个有问题的文件中,如果我选择带有值的单元格并将其复制到同一文件中的另一个工作表 (Sheet1),然后使用以下方法读取它:
pd.read_excel('redux2.xlsx', sheet_name='Sheet1', header=None, names=['foo','bar','baz'], engine='openpyxl', skiprows=1)
然后它按预期工作。
<小时 />原答案:
它正在按我的预期工作。可能与您的数据有关。请尝试以下代码。如果它有效,那么你就知道这是你的数据,而不是熊猫。
示例数据
import string
df = pd.DataFrame({
'col1': list(string.ascii_letters[:10]),
'col2': list(string.ascii_letters[10:20]),
'col3': range(1,11)
})
df.to_excel('file.xlsx', index=False)
print(df)
col1 col2 col3
0 a k 1
1 b l 2
2 c m 3
3 d n 4
4 e o 5
5 f p 6
6 g q 7
7 h r 8
8 i s 9
9 j t 10
测试
filename = 'file.xlsx'
names = ["foo", "bar", "baz"]
data_frame = pd.read_excel(
filename,
header=None,
names=names,
engine="openpyxl",
skiprows=3,
sheet_name=0,
)
print(data_frame.iloc[3])
foo f
bar p
baz 6
Name: 3, dtype: object
注意:我的熊猫版本也是'1.1.5'。