如何在不使用布尔索引的情况下遍历熊猫系列

时间:2019-01-21 15:00:24

标签: python pandas

我几次遇到这个问题。问题是我无法理解如何遍历DataFrame中的熊猫系列以访问各个值。

在这种特殊情况下,我试图在pandas DataFrame的特定列中查找每一行的最大值,其中某些行包含列表。

df就是这样:

  Date            Number
0 2000-01-01        [1.0]
1 2000-01-02        [2.2, 5, 7.8]
2 2000-01-03        [8.2]
3 2000-01-04        [4, 11.78, 24.66]

有关此问题的尝试代码如下:

Find the max of two or more columns with pandas

但是我试图替换当前列,由于某种原因,它似乎为我的列提供了一个空列表。

所需的输出如下:

  Date            Number
0 2000-01-01        1.0
1 2000-01-02        7.8
2 2000-01-03        8.2
3 2000-01-04        24.66

以最大行数替换原始文件。有关如何执行此操作的任何建议?

谢谢。

2 个答案:

答案 0 :(得分:1)

if-else使用列表理解:

import ast
df.Number = df.Number.apply(ast.literal_eval)

df.Number = [max(i, default=0) if isinstance(i, list) else i for i in df.Number]

替代apply

df.Number = df.Number.apply(lambda i: max(i, default=0) if isinstance(i, list) else i)

print (df)
         Date  Number
0  2000-01-01       1
1  2000-01-02       7
2  2000-01-03       8
3  2000-01-04      24

答案 1 :(得分:1)

您的数据混乱。建议您首先尝试确保将一致的数据(最好是通过float系列)输入到您的数据框中。失败的话,您可以使用嵌套的try / except来覆盖凌乱数据所覆盖的任意数量的场景:

df = pd.DataFrame({'Dat': ['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
                           '2000-01-05', '2000-01-06', '2000-01-07'],
                   'Number': ['1', ['2.2', '5.0', '7.8'], '8', ['4', '11.78', '24.66'],
                              np.nan, None, []]})

def calc_max(x):
    try:
        return float(x)
    except TypeError:
        try:
            return max(map(float, x), default=np.nan)
        except TypeError:
            return np.nan

# apply function to each value in 'Number'
df['Number'] = list(map(calc_max, df['Number']))

print(df)

          Dat  Number
0  2000-01-01    1.00
1  2000-01-02    7.80
2  2000-01-03    8.00
3  2000-01-04   24.66
4  2000-01-05     NaN
5  2000-01-06     NaN
6  2000-01-07     NaN

为什么您的数据混乱

选中df['Number'].dtype。如果您的数据干净/对熊猫友好,您将看到intfloat。但是在这里您看到object。这表示指向任意Python对象的一系列点。然后,其中一些对象就是列表,列表本身就是一系列指针。因此,您有一个嵌套的指针列表,而不是存储在连续内存块中的数字数组。