在 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_evalCODES 列中的字符串评估为 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