python - 在 pandas 数据框中将元素设置为 None

标签 python pandas dataframe

我不知道为什么会发生这种情况

>>> df = pd.DataFrame(np.arange(15).reshape(5,3),columns=list('ABC'))
>>> df
    A   B   C
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14

None 分配给最后一行的元素会将其变为 NaN NaN NaN:

>>> df.ix[5,:] = None
>>> df
    A   B   C
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14
5 NaN NaN NaN

将最后一列中的两个元素更改为“nan”

>>> df.ix[:1,2] = 'nan'
>>> df
    A   B    C
0   0   1  nan
1   3   4  nan
2   6   7    8
3   9  10   11
4  12  13   14
5 NaN NaN  NaN

现在最后一行变成NaN NaN None

>>> df.ix[5,:] = None
>>> df
    A   B     C
0   0   1   nan
1   3   4   nan
2   6   7     8
3   9  10    11
4  12  13    14
5 NaN NaN  None

最佳答案

这是因为每次分配后您的数据类型都会发生更改:

In [7]: df = pd.DataFrame(np.arange(15).reshape(5,3),columns=list('ABC'))

In [8]: df.dtypes
Out[8]:
A    int32
B    int32
C    int32
dtype: object

In [9]: df.loc[5,:] = None

In [10]: df.dtypes
Out[10]:
A    float64
B    float64
C    float64
dtype: object

In [11]: df.loc[:1,2] = 'nan'

最后一次赋值后,C 列已隐式转换为 object(字符串)dtype:

In [12]: df.dtypes
Out[12]:
A    float64
B    float64
C     object
dtype: object

@ayhan has written very neat answer as a comment :

I think the main reason is for numerical columns, when you insert None or np.nan, it is converted to np.nan to have a Series of type float. For objects, it takes whatever is passed (if None, it uses None; if np.nan, it uses np.nan - docs)

(c) ayhan

这是一个相应的演示:

In [39]: df = pd.DataFrame(np.arange(15).reshape(5,3),columns=list('ABC'))

In [40]: df.loc[4, 'A'] = None

In [41]: df.loc[4, 'C'] = np.nan

In [42]: df
Out[42]:
     A   B     C
0  0.0   1   2.0
1  3.0   4   5.0
2  6.0   7   8.0
3  9.0  10  11.0
4  NaN  13   NaN

In [43]: df.dtypes
Out[43]:
A    float64
B      int32
C    float64
dtype: object

In [44]: df.loc[0, 'C'] = 'a string'

In [45]: df
Out[45]:
     A   B         C
0  0.0   1  a string
1  3.0   4         5
2  6.0   7         8
3  9.0  10        11
4  NaN  13       NaN

In [46]: df.dtypes
Out[46]:
A    float64
B      int32
C     object
dtype: object

现在我们可以使用 Nonenp.nan 作为 object dtype:

In [47]: df.loc[1, 'C'] = None

In [48]: df.loc[2, 'C'] = np.nan

In [49]: df
Out[49]:
     A   B         C
0  0.0   1  a string
1  3.0   4      None
2  6.0   7       NaN
3  9.0  10        11
4  NaN  13       NaN

更新:从 Pandas 0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers 开始。

关于python - 在 pandas 数据框中将元素设置为 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39434733/

相关文章:

python - 从 Meshgrid reshape pandas DataFrame

python - 如何计算Python数据帧的列中不同版本字符串的出现次数?

Python:数据帧切片的 Pandas 数据帧条件

python - 生成 3D 验证码 [图片]

python - 根据另一个表中的多个列在一个表中创建一列 [python]

python - 无法让 pygobject 使用绘图区域

python - Pandas 无法在转置 DataFrame 上使用 Apply

python - 如何按唯一值分组 pandas groupby

python - scikit 学习 : Reshape your data either using X. reshape (-1, 1)

python - 如何为 threading.Thread 和 multiprocessing.Pool 指定本地工作目录?