【问题标题】:How to cast an integer to np.object?如何将整数转换为 np.object?
【发布时间】:2019-02-19 12:17:05
【问题描述】:

是的,我完全知道isinstance(-1, np.object) 返回True

但是,-1 != "-1"(显然)这是我的问题。

我从一个 CSV 文件中读取了一个 DataFrame,其中 -1 用于表示丢失的数据:

Numbers,Strings
1,A
2,-1
-1,B

read_csv 产生:

   Numbers Strings
0        1       A
1        2      -1
2       -1       B

dtypes

Numbers     int64
Strings    object
dtype: object

我有一个missing_value 变量,即-1

>>> missing_value = -1
>>> for c in z.columns:
      print(c,(z[c] == missing_value).sum())
Numbers 1
Strings 0
>>> (z.Strings == str(missing_value)).sum()
1

我明白为什么会发生这种情况。 我的问题是如何修改循环以便 DTRT:

for c in z.columns:
   print(c,(z[c] == (missing_value if np.issubdtype(z[c].dtype,np.number) else str(missing_value))).sum())
Numbers 1
Strings 1

这真的是正确的方法吗?

附言。额外的约束:

  1. 我无法控制 CSV 文件格式。
  2. CSV 很大,我宁愿对missing_value 进行操作,也不愿对整个表进行操作。
  3. 缺少某些字段(例如 ""),这在语义上与 -1 不同,因此不能将 na_values=-1 传递给 read_csv
  4. 实际上我不只是计算缺失值,我将df[c]missing_value 传递给函数do_complicated_analysis_on_a_series

【问题讨论】:

  • 为什么不从一开始就告诉 pandas 将 -1 视为 NaN? pd.read_csv('yourfile.csv',na_values=-1)
  • @DYZ:因为确实缺少某些字段(因此读作na
  • @sds:为什么这会阻止你使用na_values
  • @user2357112:因为我不希望 ""-1 被同等对待。
  • 好的,另一种选择是将数据帧转换为字符串并将其与“-1”进行比较。 (z.astype('str')=="-1").sum()

标签: python python-3.x pandas numpy type-conversion


【解决方案1】:

我们可以通过isin修复您的输出

df.isin([-1,'-1']).sum()

Out[276]: 
Numbers    1
Strings    1
dtype: int64

【讨论】:

  • 我需要在“每列”的基础上进行操作。另外,我的 DF 很大,所以我宁愿在 missing_value 上操作,也不愿在 df 上操作。
  • object 列可能同时包含 -1"-1" - 但不是在我的具体情况下 - 所以我真的不喜欢 isin 方法。
【解决方案2】:

如何将对象列和数字列分开并区别对待?

part1 = (z.loc[:, z.dtypes != np.object] == -1).sum()
#Numbers    1
#dtype: int64
part2 = (z.loc[:, z.dtypes == np.object] == str(-1)).sum()
#Strings    1
#dtype: int64

如有必要,可以将结果连接到一个数据帧中。

np.concat([part1, part2])

【讨论】:

  • 但你不必这样做。我的解决方案没有明确的循环。
  • 确实需要一个循环 - 我所做的很多不仅仅是计算缺失值。
  • 您的问题目前还不清楚。我建议你重写它。
  • 请看 PS4 ;-(
  • 真正需要循环遍历pandas中的列的情况并不多。也许你把问题复杂化了。
猜你喜欢
  • 2011-04-04
  • 2014-11-13
  • 1970-01-01
  • 2017-06-27
  • 2019-10-05
  • 2019-05-10
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多