【问题标题】:Update Where Equivalent in Pandas更新 Pandas 中的等效项
【发布时间】:2018-09-02 15:15:25
【问题描述】:

我在数据框中有一个不应为空的列列表。

我想删除这些列中的任何空行。我的解决方案是遍历所需的列并将列“排除”设置为在排除它们之前将向用户显示的错误消息(我将在流程结束时以报告的形式将这些信息呈现给用户)

我目前正在尝试这样的事情:

for col in requiredColumns:
    df[pd.isnull(df[col])]['excluded'] = df[pd.isnull(df[col])]['excluded'].apply(lambda x: str(x) + col + ' empty, excluded')

但没有运气 - 列没有更新。过滤器本身(仅获取空行)有效,更新部分似乎不起作用。

我习惯了 SQL:

UPDATE df SET e = e & "empty, excluded" WHERE NZ(col, '') = ''

【问题讨论】:

  • dropna()请查收
  • 我不想 dropna() - 我只是想标记 nas。
  • 然后为你工作
  • fillna 替换 nas - 我想填充不同的列。 UPDATE WHERE 等价物。

标签: python sql pandas dataframe


【解决方案1】:

如果您需要根据多个条件更新熊猫:

您可以简单地使用.loc

>>> df
      A   B    C
0     2  40  800
1     1  90  600
2     6  80  700
3  1998  70   55
4     1  90  300
5     7  80  700
6     4  20  300
7  1998  20    2
8     7  10  100
9  1998  60    2

>>> df.loc[(df['A'] > 7) & (df['B'] > 69) , 'C'] = 75

这将设置 'C' = 75,其中 'A' > 7 和 'B' > 69

【讨论】:

    【解决方案2】:

    一种方法是使用numpy 函数创建带有所需标记的列。

    设置

    import pandas as pd, numpy as np
    
    df = pd.DataFrame({'A': [1, np.nan, 2, 3, 4, 5],
                       'B': [2, 3, np.nan, 5, 1, 9],
                       'C': [5, 8, 1, 9, np.nan, 7]})
    
         A    B    C
    0  1.0  2.0  5.0
    1  NaN  3.0  8.0
    2  2.0  NaN  1.0
    3  3.0  5.0  9.0
    4  4.0  1.0  NaN
    5  5.0  9.0  7.0
    

    解决方案

    df['test'] = np.any(np.isnan(df.values), axis=1)
    
         A    B    C   test
    0  1.0  2.0  5.0  False
    1  NaN  3.0  8.0   True
    2  2.0  NaN  1.0   True
    3  3.0  5.0  9.0  False
    4  4.0  1.0  NaN   True
    5  5.0  9.0  7.0  False
    

    说明

    • np.isnan 返回一个布尔数组,对应numpy 数组的元素是否为空。
    • 根据需要使用np.anynp.all 来确定哪些行在范围内。
    • 使用df.values 从数据帧中提取底层numpy 数组。对于选定的列,您可以使用df[['A', 'B']].values

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 2018-02-06
      • 2015-08-31
      相关资源
      最近更新 更多