【问题标题】:Dropping Nulls and Slicing from Pivoted Table in Pandas在 Pandas 中从数据透视表中删除空值和切片
【发布时间】:2020-05-04 12:04:01
【问题描述】:

我在分割我的旋转数据框时遇到问题,以便我得到高于某个阈值的结果。我正在尝试过滤掉低于最小值的结果。我的数据框如下所示:

                                                                                    Qty                             
Index   Store_Nbr   201712  201801  201802  201803  201804  201805  201806  201807  201808
0               1      356     275     293     256     313     421     493     291     385
1               2      147     316     343     416     361     483     438     136     461
2               3      266     370     162     346     451     414     296     478     295
3               4      322     179     353     241     370     247     423     391     194
4               5      249     389     480     450     102     482     137     251     153
...            ...     ...     ...     ...     ...     ...     ...     ...     ...     ...
30             30        0       0       0       0       0       0       0       0       0
31             31        0       0       0       0       0       0       0       0       0
32             32        0       0       0       0       0       0       0       0       0
33             33      392     311     151     488     135     239     212     104     122
34             34        0       0       0       0       0       0       0       0      -1

使用godzilla = godzilla[godzilla['Qty'] > 150] 后,我得到了下面的数据框,它已将所有零转换为空值并且没有过滤掉任何内容。

                                                                                     Qty                                
Index   Store_Nbr   201712   201801  201802  201803  201804  201805  201806  201807  201808
0             NaN      NaN      275     293     256     313     421     493     291     385
1             NaN      147      316     343     416     361     483     438     136     461
2             NaN      266      370     162     346     451     414     296     478     295
3             NaN      NaN      179     353     241     370     247     423     391     194
4             NaN      389      480     450     102     482     137     251     153     153
...           ...     ...       ...     ...     ...     ...     ...     ...     ...     ...
30            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
31            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
32            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
33            NaN      NaN      311     151     488     135     239     212     104     122
34            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN

我尝试过 godzilla.dropna(axis = 0, inplace = True, how = 'any') 返回一个空数据框和 godzilla = godzilla.dropna( subset = godzilla['Qty']) 返回 KeyError: 'Qty'。我很困惑它将零转换为空值以及为什么切片不起作用。尝试过滤/切片透视数据时有什么智慧之言吗?

注意**我在数据框中的旋转数量超过了数量。

【问题讨论】:

  • 当一行没有所有列都为空时,你想做什么?
  • 如果一行有一个空值,我想排除它。

标签: python pandas dataframe pivot slice


【解决方案1】:

是的!您正在使用分层结构多索引。这就是为什么这些列没有被删除,而是替换为NaN。如果除了Qty 之外没有其他索引,您可以使用:

godzilla.columns = godzilla.columns.droplevel()

然后使用dropna():

godzilla = godzilla.dropna(how='any',axis=0)

【讨论】:

  • 我得到一个没有值的空数据框。 @Celius,分割分层数据帧的正确方法是什么,以便我可以过滤掉 0?
  • 它们作为元组工作,所以你的索引是 ('Qty','Store_Nbr'),('Qty','201712'),('Qty','201801') 等等。 ..
  • 这是有道理的,因为Store_Nbr 中的所有行都是空的,也就是说,它们不满足条件。在使用 dropna(how='any',axis=0') 之前,您应该考虑将其删除
【解决方案2】:

首先,您将低于 150 的每个值都替换为 None。
比你应该过滤掉至少有 1 个 None 值的行,如this Answer中所述

这应该可以解决问题:

# replaces every value of the DataFrame lower than 150 with None
godzilla = pd.DataFrame([
    [x if not isinstance(x, (int, float)) or x >= 150 else None for x in j
] for j in godzilla.as_matrix()])

# replaces every value of the Column "Qty" lower than 150 with None
df["Qty"] = [x if not isinstance(x, (int, float)) or x >= 20 else None for x in df["Qty"]

#dropna will drop all rows with at least 1 null value
df = df.dropna(how='any',axis=0)

【讨论】:

  • 这不起作用。如果我能让切片首先工作,那将是最佳选择。
  • 取回 'TypeError: 'method' object is not iterable'
  • 你到底做了什么?
【解决方案3】:

我终于明白了。抱歉耽搁了。感谢大家提出的答案。错误完全是我自己造成的。在代码的前面部分,我使用了.drop_index(),因为当时我没有意识到我可以使用.index 来操作索引。在我更正代码之后,使用godzilla = godzilla[godzilla['Qty'] > 150].dropna() 设置参数就没有问题了。

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2015-07-17
    • 2016-07-08
    相关资源
    最近更新 更多