在pandas DataFrame中,如果另一个列不为空,则用另一个列替换一个列

17
我正在使用Pandas处理数据帧,如果另一列的值不是空值,我需要替换一个列。我的数据帧看起来像这样:
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

那么,我想在pfv不为null的情况下用pfv替换v_5,我该怎么做?


你可以尝试一下: DF[numpy.isnan(DF["pfv"])]["v_5 "] =DF["pfv"] - Gwendal Yviquel
你认为缺失值是空字符串吗? - jezrael
我认为这些是“null”。 - Abdul Rehman
不是 NaNNone 吗? - jezrael
所以 df.loc[df['pfv'].ne('null'), 'v5'] = df["pfv"] 对你有用吗? - jezrael
6个回答

19

您应该考虑使用NumPy where函数,它的运行速度比所有apply方法都要快得多。

Where基本上是向量的if else函数。第一个条目是带有条件的向量,第二个是真值,第三个是假值。以下是它的示例:

import numpy as np
df['v_5'] = np.where(~df['pfv'].isnull(),df['pfv'],df['v_5'])

祝你好运


5

由于缺失值是字符串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

虽然已经晚了一些,但如果确实是 nulls(而不是 'null' 字符串),您也可以使用以下方法:

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

这相当于SQL中的COALESCE()函数。


1

我的解决方案与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' 是数据框。

    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列。 该命令表示我们将用pfv替换v5,但如果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

哦,你怎么知道缺失值是空字符串的呢? - jezrael
我不知道。我写了一篇文章,在pfv中留下了一个空白。当我尝试使用fillna时,它没有起作用,因为没有NaN需要填充。我发帖回答了这个问题,以防万一。 - powerPixie

1
你可以使用 pandas 中的 Series.update 来用传递的序列中的非 NA 值替换。因此,你需要首先将 'null' 替换为 NaN。
示例:
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)

或者如果您不想将 null 更改为 NaN

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)

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接