我正在使用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
,如何实现?
答案 0 :(得分:3)
您应该考虑使用numpy where函数,该函数在所有apply方法中的运行速度要快得多。
如果是else函数,基本上是哪里。第一个条目是带有条件的向量,第二个条目为true则为值,第三个为false。这是它的外观:
flag
祝你好运
答案 1 :(得分:0)
您可以使用pandas
和numpy
中的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
如果缺少的值是NaN
或None
(不是字符串),请使用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()
。