【问题标题】:TypeError: bad operand type for unary ~: 'float'TypeError:一元操作数类型错误〜:'float'
【发布时间】:2019-02-08 02:39:45
【问题描述】:

我需要处理一个看起来很奇怪的数据框。它看起来像这样:

   Unnamed: 0       REFERENCE_CODE  ... Unnamed: 12  Unnamed: 13
0          Q2        country_satis  ...         NaN          NaN
1         NaN                    1  ...         NaN          NaN
2         NaN                    2  ...         NaN          NaN
3         NaN                    8  ...         NaN          NaN
4         NaN                    9  ...         NaN          NaN
5         NaN                  NaN  ...         NaN          NaN
6          Q3             econ_sit  ...         NaN          NaN
5         NaN                  NaN  ...         NaN          NaN
7         NaN                    1  ...         NaN          NaN
8         NaN                    2  ...         NaN          NaN
9         NaN                    3  ...         NaN             
10        NaN                    4  ...         NaN          NaN
11        NaN                    8  ...         NaN          NaN
12        NaN                    9  ...         NaN          NaN
13        NaN                  NaN  ...         NaN          NaN
14         Q4  children_betteroff2  ...         NaN  Не четете! 
15        NaN                    1  ...         NaN          NaN
16        NaN                    2  ...         NaN          NaN
15        NaN                  NaN  ...         NaN          NaN
18        NaN                    8  ...         NaN          NaN
19        NaN                    9  ...         NaN          NaN
20        NaN                  NaN  ...         NaN          NaN
21         Q5  satisfied_democracy  ...         NaN          NaN
22        NaN                    1  ...         NaN          NaN
23        NaN                    2  ...         NaN          NaN
24        NaN                    3  ...         NaN          NaN

(我在这里对原件进行了一些编辑,以反映这个非常长的数据帧中可能出现的内容)。我的目标是为与问题(例如 country_statis)关联的每个值(例如 1、2、8、9)生成一个唯一 ID。我正在尝试将 country_satis 连接到 1,以便我所有的“块”都有

0          Q2        country_satis  ...         NaN          NaN
1         NaN     country_statis_1  ...         NaN          NaN
2         NaN     country_statis_2  ...         NaN          NaN
3         NaN     country_statis_8  ...         NaN          NaN
4         NaN     country_statis_9  ...         NaN          NaN
5         NaN                  NaN  ...         NaN          NaN

这是我的尝试:

df.REFERENCE_CODE = df.REFERENCE_CODE.fillna('')

df.REFERENCE_CODE.str.isnumeric().dtype # returns object

headers = (df.REFERENCE_CODE != '') & ~df.REFERENCE_CODE.str.isnumeric()

res = df.groupby(headers.cumsum())['REFERENCE_CODE'].apply(lambda x: x.iloc[0] + '_' + x)

df.REFERENCE_CODE.update(res[df.REFERENCE_CODE.str.isnumeric()])

我的目标也是保持数据的完整性和结构,因为最终,理想情况下,我希望执行 2 个数据源的干净合并。我可能应该在 SQL 中执行此操作,哈哈。

此处出错:

Traceback (most recent call last):
  File "/Users/xx/Projects/trend_env/src/script4.py", line 10, in <module>
    df.REFERENCE_CODE = df.REFERENCE_CODE.fillna('')
  File "/Users/xx/Projects/trend_env/lib/python3.7/site-packages/pandas/core/generic.py", line 5067, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'REFERENCE_CODE'

编辑:

很抱歉,我发布了错误的脚本错误。这是错误消息:

Traceback (most recent call last):
  File "/Users/xxx/Projects/trend_env/src/script4.py", line 16, in <module>
    headers = (df.REFERENCE_CODE != '') & ~df.REFERENCE_CODE.str.isnumeric()
  File "/Users/xxx/Projects/trend_env/lib/python3.7/site-packages/pandas/core/generic.py", line 1466, in __invert__
Index(['Question number', 'REFERENCE_CODE', 'Filter', 'English stem',
       'Translator note', 'Philippines - Bicolano', 'Philippines - Cebuano',
       'Philippines - Ilonggo', 'Philippines Ilokano', 'Philippines - Tagalog',
       'Unnamed: 10', 'Unnamed: 11', 'Unnamed: 12', 'Unnamed: 13'],
      dtype='object')
    arr = operator.inv(com.values_from_object(self))
TypeError: bad operand type for unary ~: 'float'

EDIT2:

按照安迪·海登的说法——你介意帮我解决这个逻辑吗?我的代码工作得很好。我有一个 df 看起来像这样的情况:

25                     partyfav_batt                   NaN
26            partyfav_bulgaria_GERB                   NaN
27             partyfav_bulgaria_BSP                   NaN
28             partyfav_bulgaria_DPS                   NaN
29                                                     NaN
30           partyfav_bulgaria_DPS_1                   NaN
31           partyfav_bulgaria_DPS_2                   NaN
32           partyfav_bulgaria_DPS_3                   NaN
33           partyfav_bulgaria_DPS_4                   NaN
34           partyfav_bulgaria_DPS_8                   NaN
35           partyfav_bulgaria_DPS_9                   NaN
36                                                     NaN
37                     partyfav_batt                   NaN
38               partyfav_canada_Lib                   NaN
39              partyfav_canada_Cons                   NaN
40               partyfav_canada_NDP                   NaN
41                                                     NaN
42             partyfav_canada_NDP_1                   NaN
43             partyfav_canada_NDP_2                   NaN
44             partyfav_canada_NDP_3                   NaN
45             partyfav_canada_NDP_4                   NaN
46             partyfav_canada_NDP_8                   NaN
47             partyfav_canada_NDP_9                   NaN

我怎样才能得到它,这样如果它看到一个块......

37                     partyfav_batt                   NaN
38               partyfav_canada_Lib                   NaN
39              partyfav_canada_Cons                   NaN
40               partyfav_canada_NDP                   NaN

变成了这样的东西(我已经浓缩了):

39              partyfav_canada_Cons                   NaN
40               partyfav_canada_NDP                   NaN
41                                                     NaN
42            partyfav_canada_Cons_1                   NaN
43            partyfav_canada_Cons_2                   NaN
44            partyfav_canada_Cons_3                   NaN
45            partyfav_canada_Cons_4                   NaN    
42             partyfav_canada_NDP_1                   NaN
43             partyfav_canada_NDP_2                   NaN
44             partyfav_canada_NDP_3                   NaN
45             partyfav_canada_NDP_4                   NaN

【问题讨论】:

  • 它们可能是你的列名前面的空格,检查 df.columns
  • 不,返回 'REFERENCE_CODE'
  • 上面的例子对我有用...
  • 上面的编辑,对不起...你的意思是它有效吗?你能告诉我输出吗?
  • @sgerbhctim 当我复制上面的示例 df 并从剪贴板读取时,您的尝试按预期运行,没有错误。

标签: python python-3.x pandas


【解决方案1】:

你可以先fillna

~df.REFERENCE_CODE.fillna('').str.isnumeric()

例子:

In [11]: s = pd.Series(['1', np.nan, 'c'])

In [12]: s
Out[12]:
0      1
1    NaN
2      c
dtype: object

In [13]: s.str.isnumeric()
Out[13]:
0     True
1      NaN
2    False
dtype: object

In [14]: ~s.str.isnumeric()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-2e51f8bd1622> in <module>()
----> 1 ~s.str.isnumeric()

~/.miniconda3/lib/python3.7/site-packages/pandas/core/generic.py in __invert__(self)
   1141     def __invert__(self):
   1142         try:
-> 1143             arr = operator.inv(com._values_from_object(self))
   1144             return self.__array_wrap__(arr)
   1145         except Exception:

TypeError: bad operand type for unary ~: 'float'

In [15]: ~s.fillna('').str.isnumeric()
Out[15]:
0    False
1     True
2     True
dtype: bool

【讨论】:

  • 这太不可思议了。太感谢了。我在上面做了一些编辑,如果你不介意帮我解决这个逻辑,那将有很大帮助。欣赏!
  • @sgerbhctim 请创建一个新问题!
  • 非常感谢@Andy Hayden
  • @sgerbhctim 谢谢稍后再看(或者也许有人已经回答了)。
猜你喜欢
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2013-08-11
  • 2013-03-28
  • 2023-03-31
  • 1970-01-01
  • 2021-01-15
相关资源
最近更新 更多