如果pandas DataFrame中的另一列不为null,请用另一列替换

时间:2019-10-09 11:40:09

标签: python pandas dataframe

我正在使用padnas处理数据框,如果另一个colum值不为null,则必须替换其中的列。

我的数据框类似于:

v_4        v5             s_5     vt_5     ex_5          pfv           pfv_cat
0-50      StoreSale     Clothes   8-Apr   above 100   FatimaStore       Shoes
0-50      StoreSale     Clothes   8-Apr   0-50        DiscountWorld     Clothes
51-100    CleanShop     Clothes   4-Dec   51-100      BetterUncle       Shoes

因此,我想用v_5不为null的pfv替换pfv,如何实现?

6 个答案:

答案 0 :(得分:3)

您应该考虑使用numpy where函数,该函数在所有apply方法中的运行速度要快得多。

如果是else函数,基本上是哪里。第一个条目是带有条件的向量,第二个条目为true则为值,第三个为false。这是它的外观:

flag

祝你好运

答案 1 :(得分:0)

您可以使用pandasnumpy中的apply方法:

df['v_5'] = df.apply(lambda row: row['pfv'] if row['pfv']==np.NaN else row['v_5'], axis=1)

或不使用numpy:

df['v_5'] = df.apply(lambda row: row['pfv'] if pd.isnull(row['pfv']) else row['v_5'], axis=1)

答案 2 :(得分:0)

由于缺少的值是字符串null,请使用:

df.loc[df['pfv'].ne('null'), 'v5'] = df["pfv"]
print (df)
      v_4             v5      s_5   vt_5       ex_5            pfv  pfv_cat
0    0-50      StoreSale  Clothes  8-Apr  above 100           null    Shoes
1    0-50  DiscountWorld  Clothes  8-Apr       0-50  DiscountWorld  Clothes
2  51-100    BetterUncle  Clothes  4-Dec     51-100    BetterUncle    Shoes

如果缺少的值是NaNNone(不是字符串),请使用Series.fillna

df['v5'] = df['pfv'].fillna(df['v5'])

print (df)
      v_4             v5      s_5   vt_5       ex_5            pfv  pfv_cat
0    0-50      StoreSale  Clothes  8-Apr  above 100            NaN    Shoes
1    0-50  DiscountWorld  Clothes  8-Apr       0-50  DiscountWorld  Clothes
2  51-100    BetterUncle  Clothes  4-Dec     51-100    BetterUncle    Shoes

答案 3 :(得分:0)

我的解决方案与jezrael相同,但又有一个步骤,这是基于我针对空问题所做的一篇文章。 我为没有值的pfv增加了一行。

    data = [['0-50','StoreSale','Clothes','8-Apr','above 100','FatimaStore','Shoes'],
    ['0-50','StoreSale','Clothes','8-Apr','0-50','DiscountWorld','Clothes'],
    ['51-100','CleanShop','Clothes','4-Dec','51-100','BetterUncle','Shoes'],
    ['0-50','StoreSale','Clothes','12-Apr','above 100','','Clothes']]

第一步是处理空值。 “ df”是DataFrame。

    df = df.replace('', np.nan)

          v_4         v5      s_5    vt_5       ex_5            pfv  pfv_cat
    0    0-50  StoreSale  Clothes   8-Apr  above 100    FatimaStore    Shoes
    1    0-50  StoreSale  Clothes   8-Apr       0-50  DiscountWorld  Clothes
    2  51-100  CleanShop  Clothes   4-Dec     51-100    BetterUncle    Shoes
    3    0-50  StoreSale  Clothes  12-Apr  above 100            NaN  Clothes

现在,让我们更新v5列。 该命令说我们将用v5替换pfv,但是如果pfv是NaN,我们将用v5的当前值替换。

    df['v5'] = df['pfv'].fillna(df['v5'])


    print(df)

         v_4             v5      s_5    vt_5       ex_5            pfv  pfv_cat
    0    0-50    FatimaStore  Clothes   8-Apr  above 100    FatimaStore    Shoes
    1    0-50  DiscountWorld  Clothes   8-Apr       0-50  DiscountWorld  Clothes
    2  51-100    BetterUncle  Clothes   4-Dec     51-100    BetterUncle    Shoes
    3    0-50      StoreSale  Clothes  12-Apr  above 100            NaN  Clothes

答案 4 :(得分:0)

您可以使用pandas中的Series.update替换为传递的Series中的非NA值。

因此,您首先需要用NaN替换'null'。

示例:

import pandas as pd
import numpy as np

 df = pd.DataFrame({'A': ['a', 'b', 'c'],
               'B': ['x', 'null', 'z']})

 # Replace null with nan
 df.loc[:,'B']  =  df.loc[:,'B'].replace('null', np.nan)
 # Update column, only if other column is non-nan (inplace)
 df.A.update(df.B)

或者如果您不想使用NaN更改null

import pandas as pd
import numpy as np

 df = pd.DataFrame({'A': ['a', 'b', 'c'],
               'B': ['x', 'null', 'z']})

 # Replace null with nan
 temp  =  df.loc[:,'B'].replace('null', np.nan)
 # Update column, only if other column is non-nan (inplace)
 df.A.update(temp)

答案 5 :(得分:0)

游戏后期,但如果确实是nulls(不是'null'字符串),您也可以使用

df['v_5'] = df['pfv'].combine_first(df['v_5'])

相当于SQL中的COALESCE()