python-3.x Pandas read_xml将“N/A”读取为NaN

pw136qt2  于 2023-04-13  发布在  Python
关注(0)|答案(1)|浏览(174)

我正在使用pandas中的“read_xml“函数阅读xml文件。
XML文件
<resources>
<string name="label_generate_transfer_code">Generate Transfer Code</string>
<string name="label_select_all">Select All</string>
<string name="label_sequence_number">Sequence Number: %1$s</string>
<string name="label_serial_number">Serial Number: %1$s</string>
<string name="label_model">Model: %1$s</string>
<string name="transfer_confirmation_feature_item">• %1$s</string>
<string name="label_current">(Current)</string>
<string name="label_primary_display">Primary Display</string>
<string name="label_secondary_display">Secondary Display</string>
<string name="label_pcm">PCM</string>
<string name="label_receiver">Receiver</string>

<string name="label_not_available">N/A</string>

<string name="label_menu">Menu</string>
<string name="label_activations">Activations</string>
<string name="label_activations_title">Activation Input Method</string>
</resources>
这就是我正在做的读取xml文件。
local_xml_frame = pd.read_xml(xml_file_path,xpath=".//string")
在阅读xml文件时,pandas正在将“N/A”字符串值转换为NaN”。

我浏览了官方文档,其中指出“数据或列的数据类型。例如'a':np.float64,'b':np.int32,'c':'Int 64'}“将str或object与适当的na_values设置一起使用,以保留而不解释dtype"。如果指定了转换器,则将应用转换器而不是dtype转换。”
我无法理解如何使用突出显示的信息来避免将“N/A”转换为NaN。
有人能给我提供这个问题的确切解决方案吗?

iklwldmw

iklwldmw1#

另一种解决方法是手动解析xml文件,然后将其转换为csv,然后使用pd.read_csv再次读取,让Pandas推断数据类型:

from lxml import etree
from io import StringIO

data = []
root = etree.parse(local_xml_path)
for elmt in root.findall('.//string'):
    d = elmt.attrib
    d.update({elmt.tag: elmt.text})
    data.append(d)
buf = StringIO(pd.DataFrame(data).to_csv(index=False))
df = pd.read_csv(buf, keep_default_na=False)

输出:

>>> df
                                  name                   string
0         label_generate_transfer_code   Generate Transfer Code
1                     label_select_all               Select All
2                label_sequence_number    Sequence Number: %1$s
3                  label_serial_number      Serial Number: %1$s
4                          label_model              Model: %1$s
5   transfer_confirmation_feature_item                   • %1$s
6                        label_current                (Current)
7                label_primary_display          Primary Display
8              label_secondary_display        Secondary Display
9                            label_pcm                      PCM
10                      label_receiver                 Receiver
11                 label_not_available                      N/A
12                          label_menu                     Menu
13                   label_activations              Activations
14             label_activations_title  Activation Input Method

pd.read_csv函数没有参数na_valueskeep_default_nana_filter。但是在pd.read_xml的文档中,我们可以读取dtype参数:

dtype类型名称或列-〉类型的dict,可选

数据或列的数据类型。例如'a':np.float64,'b':np.int32,'c':'Int 64'}使用str或object以及适当的na_values设置来保留而不解释dtype。如果指定了转换器,则将应用它们而不是dtype转换。
但是当你尝试像pd.read_xml(..., dtype=str, na_values=[])这样的东西时,Pandas会引发TypeError: read_xml() got an unexpected keyword argument 'na_values'异常。所以文档与代码不一致。
可能的解决方法:

cols = local_xml_frame.select_dtypes(object).columns
local_xml_frame[cols] = local_xml_frame[cols].fillna('N/A')

相关问题