【问题标题】:Indexing pandas dataframe with array as iloc input - "ValueError"使用数组作为 iloc 输入的索引 pandas 数据帧 - “ValueError”
【发布时间】:2022-01-25 15:07:36
【问题描述】:

我有一个 pandas 数据框(df),我想索引它以仅显示列中总和不为零的列。 我正在使用 .to_numpy().nonzero() 方法来创建一个非零索引的元组。我检查了 pandas.DataFrame.iloc 文档,发现只有 int 的数组/列表可用于索引,所以我将这个非零索引元组更改为一个列表:

import pandas as pd
#...
df = pd.read_table(f)
df_sum = df.sum(axis = 0)
df_no_0_tuple = df_sum.to_numpy().nonzero() #--> prints (array([ 7,  8,  9, 10, 11, 25, 26, 27, 28, 29, 31, 32, 36], dtype=int64),)
print(type(df_no_0_tuple)) #--> prints "<class 'tuple'>"
df_no_0 = list(df_no_0_tuple)
print(type(df_no_0)) #--> prints "<class 'list'>"
print(df_no_0) #--> prints [array([ 7,  8,  9, 10, 11, 25, 26, 27, 28, 29, 31, 32, 36], dtype=int64)]
df_final = df.iloc[:, df_no_0]
print[df_final]

如标题中所述:如果我使用 df_no_0 作为 iloc 输入,则会收到错误消息:“ValueError: Buffer has wrong number of dimensions (expected 1, got 2)” 这里的问题是:df_no_0 列表是否还包括“dtype=int64”部分,这会导致尺寸错误(预期为 1,得到 2)?如果是这样,有没有办法在使用列表转换时删除甚至不创建类型信息?

如果我直接从 to_numpy().nonzero() 使用元组,我会收到错误:“pandas.core.indexing.IndexingError: Too many indexers”。我认为这里可能会导致不同的错误,因为与列表相比,元组中现在有三个用逗号“,”分隔的索引器。 这个问题留给我: 如何使用 to_numpy().nonzero() 的输出正确索引数据帧,或者如何将该输出转换为 .iloc 索引的可行输入?

顺便说一句:如果我只是手动以列表格式输入 to_numpy().nonzero() 的输出,则索引按预期工作。这对于在以前不知道它们的非零列的情况下索引多个文件来说是很乏味的。

非常感谢任何帮助!

提前谢谢你!

【问题讨论】:

  • 请使用df.head() 的输出更新您的帖子。
  • df_no_0 似乎是一个列表,但它包含一个 numpy 数组。将df_no_0_tuple = df_sum.to_numpy().nonzero() 更改为df_no_0_tuple = df_sum.to_numpy().nonzero()[0],这样你就得到了元组的第一个元素。那就是你要使用的那个。

标签: python pandas dataframe


【解决方案1】:

这样的东西对你有用吗?

某些列总和为零的数据框示例:

df = pd.DataFrame([[1, 3, 0, 2, 0],
                   [3, 4, 0, 4, 0],
                   [5, 1, 0, 3, 0]],
                   columns = ['a', 'b', 'c', 'd', 'e'])

要删除仅加和为零的列:

df.loc[:, (df.sum() != 0)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    相关资源
    最近更新 更多