在 Pandas 中使用 Lambda 函数时,Str 对象没有属性 'keys'
Str object has no attribute 'keys' while using Lambda function in Pandas
我得到错误 - 'str' 对象没有属性 'keys' 而 运行 lambda 代码爆炸。
ID CODES
A {"1407273790":5,"1801032636":20,"1174813554":1,"1215470448":2,"1053754655":4,"1891751228":1}
B {"1497066526":19,"1639360563":16,"1235107087":11,"1033522925":18}
C {"1154348191":8,"1568410355":4}
我正在使用以下代码 -
df['CODES'] = df['CODES'].apply(lambda x: [*x.keys()]) # or lambda x: list(x.keys()))
df = df.explode('CODES')
df
我收到错误 - 'str' 对象没有属性 'keys'
得到这个-
ID CODES
A 1407273790
A 1801032636
A 1174813554
A 1215470448
A 1053754655
A 1891751228
B 1497066526
B 1639360563
B 1235107087
B 1033522925
C 1154348191
C 1568410355
看起来 CODES
列是字符串类型的,而不是字典类型的。您可以通过以下方式确认:
type(df['CODES'].iloc[0])
# should get `str`
如果是这样,请尝试:
(df['CODES'].str.extractall('"(?P<CODES>[^"]*)"') # extract pattern between " "
.reset_index('match',drop=True) # drop the match number
.join(df[['ID']]) # join ID back
)
输出:
CODE ID
0 1407273790 A
0 1801032636 A
0 1174813554 A
0 1215470448 A
0 1053754655 A
0 1891751228 A
1 1497066526 B
1 1639360563 B
1 1235107087 B
1 1033522925 B
2 1154348191 C
2 1568410355 C
您可以使用 str.findall
和正则表达式模式从字典中提取所有出现的代码,例如字符串,然后 explode
数据框:
df.assign(CODES=df['CODES'].str.findall(r'"(\d+)"')).explode('CODES')
另一个想法是使用 literal_eval
将 CODES
列中的字符串评估为 python 字典,然后 explode
数据框:
from ast import literal_eval
df.assign(CODES=df['CODES'].map(literal_eval).map(list)).explode('CODES')
ID CODES
0 A 1407273790
0 A 1801032636
0 A 1174813554
0 A 1215470448
0 A 1053754655
0 A 1891751228
1 B 1497066526
1 B 1639360563
1 B 1235107087
1 B 1033522925
2 C 1154348191
2 C 1568410355
我得到错误 - 'str' 对象没有属性 'keys' 而 运行 lambda 代码爆炸。
ID CODES
A {"1407273790":5,"1801032636":20,"1174813554":1,"1215470448":2,"1053754655":4,"1891751228":1}
B {"1497066526":19,"1639360563":16,"1235107087":11,"1033522925":18}
C {"1154348191":8,"1568410355":4}
我正在使用以下代码 -
df['CODES'] = df['CODES'].apply(lambda x: [*x.keys()]) # or lambda x: list(x.keys()))
df = df.explode('CODES')
df
我收到错误 - 'str' 对象没有属性 'keys'
得到这个-
ID CODES
A 1407273790
A 1801032636
A 1174813554
A 1215470448
A 1053754655
A 1891751228
B 1497066526
B 1639360563
B 1235107087
B 1033522925
C 1154348191
C 1568410355
看起来 CODES
列是字符串类型的,而不是字典类型的。您可以通过以下方式确认:
type(df['CODES'].iloc[0])
# should get `str`
如果是这样,请尝试:
(df['CODES'].str.extractall('"(?P<CODES>[^"]*)"') # extract pattern between " "
.reset_index('match',drop=True) # drop the match number
.join(df[['ID']]) # join ID back
)
输出:
CODE ID
0 1407273790 A
0 1801032636 A
0 1174813554 A
0 1215470448 A
0 1053754655 A
0 1891751228 A
1 1497066526 B
1 1639360563 B
1 1235107087 B
1 1033522925 B
2 1154348191 C
2 1568410355 C
您可以使用 str.findall
和正则表达式模式从字典中提取所有出现的代码,例如字符串,然后 explode
数据框:
df.assign(CODES=df['CODES'].str.findall(r'"(\d+)"')).explode('CODES')
另一个想法是使用 literal_eval
将 CODES
列中的字符串评估为 python 字典,然后 explode
数据框:
from ast import literal_eval
df.assign(CODES=df['CODES'].map(literal_eval).map(list)).explode('CODES')
ID CODES
0 A 1407273790
0 A 1801032636
0 A 1174813554
0 A 1215470448
0 A 1053754655
0 A 1891751228
1 B 1497066526
1 B 1639360563
1 B 1235107087
1 B 1033522925
2 C 1154348191
2 C 1568410355