在具有 TypeError: 'float' 对象的数据帧内的列表中查找最小值是不可迭代的

Finding the minimum value in lists inside a dataframe with TypeError: 'float' object is not iterable

提问人:edge-case 提问时间:11/10/2023 更新时间:11/10/2023 访问量:30

问:

我生成了一个包含一列列表的 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

如何找到每个列表的最小值?

python pandas 数据帧 嵌套列表

评论

1赞 John Gordon 11/10/2023
数据帧中的最后一行在“列表”列中只有一个 NaN,而不是列表。大概这就是问题所在。

答:

0赞 edge-case 11/10/2023 #1

棘手的部分是列表推导无法遍历第 4 行中的值 .这就是导致“浮点”错误的原因。NaN

解决此问题的一种方法是将所有 s 替换为 inside a list,如下所示:NaNNaN[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()]

或者使用 explodegroupby.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