【发布时间】: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