提问人:edge-case 提问时间:11/10/2023 更新时间:11/10/2023 访问量:30
在具有 TypeError: 'float' 对象的数据帧内的列表中查找最小值是不可迭代的
Finding the minimum value in lists inside a dataframe with TypeError: 'float' object is not iterable
问:
我生成了一个包含一列列表的 Dataframe,但如果没有值,则改用 NaN。
import pandas as pd
df = pd.DataFrame(columns=['Lists', 'Min'])
df['Lists'] = [ [1,2,3], [4,5,6], [7,8,9], float('NaN') ]
print(df)
Lists Min
0 [1, 2, 3] NaN
1 [4, 5, 6] NaN
2 [7, 8, 9] NaN
3 NaN NaN
我想在同一行中包含相应列表的最小值。因此:df['Min']
Lists Min
0 [1, 2, 3] 1
1 [4, 5, 6] 4
2 [7, 8, 9] 7
3 NaN NaN
但是,当我尝试列表推导时,我收到一个错误。
df['Min'] = [min(x) for x in df.Lists.tolist()]
产生错误
TypeError: 'float' object is not iterable
如何找到每个列表的最小值?
答:
0赞
edge-case
11/10/2023
#1
棘手的部分是列表推导无法遍历第 4 行中的值 .这就是导致“浮点”错误的原因。NaN
解决此问题的一种方法是将所有 s 替换为 inside a list,如下所示:NaN
NaN
[NaN]
df['Lists'] = df['Lists'].fillna({i: [float('NaN')] for i in df.index})
df['Min'] = [min(x) for x in df.Lists.tolist()]
print(df)
Lists Min
0 [1, 2, 3] 1.0
1 [4, 5, 6] 4.0
2 [7, 8, 9] 7.0
3 [nan] NaN
1赞
Panda Kim
11/10/2023
#2
法典
make list without nan & make DataFrame 用于查找最小值
tmp = df['Lists'].dropna()
df['Min'] = pd.DataFrame(tmp.tolist(), index=tmp.index).min(axis=1)
DF:
Lists Min
0 [1, 2, 3] 1.0
1 [4, 5, 6] 4.0
2 [7, 8, 9] 7.0
3 NaN NaN
1赞
mozway
11/10/2023
#3
您可以通过检查值是否为 NaN/iterable/a list 来轻松修复您的列表推导式:
df['Min'] = [x if pd.isna(x) else x for min(x) in df.Lists.tolist()]
df['Min'] = [min(x) if hasattr(x, '__iter__') else float('nan') for x in df.Lists.tolist()]
df['Min'] = [min(x) if isinstance(x, list) else float('nan') for x in df.Lists.tolist()]
或者使用 explode
和 groupby.min
:
df['Min'] = df['Lists'].explode().groupby(level=0).min()
输出:
Lists Min
0 [1, 2, 3] 1.0
1 [4, 5, 6] 4.0
2 [7, 8, 9] 7.0
3 NaN NaN
评论