首页 > 解决方案 > Python Pandas:在 lambda / TypeError 中使用映射函数:(“int() 参数必须是字符串、类似字节的对象或数字,而不是“列表””

问题描述

我是 Python 和 Pandas 的新手,并且在一个 DataFrame 上苦苦挣扎了很长一段时间。花一些研究并阅读了许多论坛,但仍然无法解决它。除其他外,现在我正在尝试将一系列列表的每个元素从 Str 转换为 Int。经过一些研究,考虑通过在 apply 语句中应用 axis = 1 在 lambda 中为每一行使用map 函数。

然而,由于某种原因,map 函数变得混乱,因为它没有将单行称为列表。当应用于具有附加索引约束(如 )的单行时df['Column1'][1],它似乎可以正常工作,但是,如果没有[1]. 结果,我收到如下错误消息: #TypeError: ("int() argument must be a string, a bytes-like object or a number, not 'list'", 'occurred at index 0') . 可能我错过了一些特殊的语法,对链接的引用,或者它根本不像我认为的那样工作。任何帮助和建议将不胜感激!提前谢谢了!

PS 由于浮点类型的缺失值(nan),还有一些额外的复杂性。由于 Series 是 List 和 Float 的混合体,因此某些命令和函数不起作用,因此需要在 lambda 中应用 if 条件。最后我分两步完成了它,因为 notnull() 在单行的 lambda 语句中不起作用......

下面是一个简单的代码,它应该说明 DataFrame 和我正在尝试做的事情。

import pandas as pd
import numpy as np

df = pd.DataFrame(pd.Series([['1'],['2','2'],['3','4','5'],np.nan]), columns = ['Column1'])


df['Empty_flag'] = df['Column1'].notnull()

#As a single component it works well.
list(map(int, df['Column1'][1]))

#When applied on the entire series, however, it returns an error message
df['Column2'] = df.apply(lambda x: list(map(int, df['Column1'])) if x['Empty_flag'] else None ,axis=1)

#TypeError: ("int() argument must be a string, a bytes-like object or a number, not 'list'", 'occurred at index 0')

标签: pythondictionarylambdatypeerror

解决方案


这应该有助于:

import pandas as pd
import numpy as np

df = pd.DataFrame(pd.Series([['1'],['2','2'],['3','4','5'],np.nan]), columns = ['Column1'])
df['Empty_flag'] = df['Column1'].notnull()
df['Column2'] = df.apply(lambda x: list(map(int, x['Column1'])) if x['Empty_flag'] else None ,axis=1)
>>> df
     Column1  Empty_flag    Column2
0        [1]        True        [1]
1     [2, 2]        True     [2, 2]
2  [3, 4, 5]        True  [3, 4, 5]
3        NaN       False       None
>>> type(df["Column2"][0][0])
<class 'int'>

推荐阅读