pandas:如何使用包含 np.nan 的字符串列保存到 hdf 数据帧
pandas: how to save to hdf dataframe with string columns containing np.nan
我想知道是否有一种好的方法可以将包含字符串列的 pandas 数据帧保存到 hdf。
给定数据框:
In [6]: df.head()
Out[6]:
Protocol Src Bytes
10 ICMP NaN 1062
11 ICMP 10.2.0.74 2146
12 ICMP 10.100.100.1 857520
13 ICMP 10.100.100.2 857520
14 ICMP 10.100.100.2 7000
df.to_hdf('save.h5' ,'table')
结果:
/home/lpuggini/MyApps/python_2_7_numerical/lib/python2.7/site-packages/pandas/core/generic.py:1138: PerformanceWarning:
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed,key->block0_values] [items->['Protocol', 'Src']]
return pytables.to_hdf(path_or_buf, key, self, **kwargs)
此消息可以避免将列转换为 str
作为:
df['Src'] = df['Src'].apply(str)
但是 np.nan
也会被保存为 'nan'
是否有更好的方法来保存包含 string
和 np.nan
列的数据框?
HDF 文件中的列必须是单一数据类型。 nan
在 numpy 内部由 float
表示。您可以通过以下方式将 nan
值替换为空字符串:
df['src'].fillna('')
HDF 在数字类型上的表现比字符串要好得多,因此将您的 IP 地址转换为整数类型可能更有意义。
编辑:请参阅下面@Jeff 的注释。上面的 format='fixed' 是正确的。
Edit2:根据 docs,您可以为字符串 dtype cols 指定 nan 在磁盘上的表示形式:
df.to_hdf((...), nan_rep='whatever you want')
我想知道是否有一种好的方法可以将包含字符串列的 pandas 数据帧保存到 hdf。
给定数据框:
In [6]: df.head()
Out[6]:
Protocol Src Bytes
10 ICMP NaN 1062
11 ICMP 10.2.0.74 2146
12 ICMP 10.100.100.1 857520
13 ICMP 10.100.100.2 857520
14 ICMP 10.100.100.2 7000
df.to_hdf('save.h5' ,'table')
结果:
/home/lpuggini/MyApps/python_2_7_numerical/lib/python2.7/site-packages/pandas/core/generic.py:1138: PerformanceWarning:
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed,key->block0_values] [items->['Protocol', 'Src']]
return pytables.to_hdf(path_or_buf, key, self, **kwargs)
此消息可以避免将列转换为 str
作为:
df['Src'] = df['Src'].apply(str)
但是 np.nan
也会被保存为 'nan'
是否有更好的方法来保存包含 string
和 np.nan
列的数据框?
HDF 文件中的列必须是单一数据类型。 nan
在 numpy 内部由 float
表示。您可以通过以下方式将 nan
值替换为空字符串:
df['src'].fillna('')
HDF 在数字类型上的表现比字符串要好得多,因此将您的 IP 地址转换为整数类型可能更有意义。
编辑:请参阅下面@Jeff 的注释。上面的 format='fixed' 是正确的。
Edit2:根据 docs,您可以为字符串 dtype cols 指定 nan 在磁盘上的表示形式:
df.to_hdf((...), nan_rep='whatever you want')