Python 替换屏蔽数据帧内的NaN
这将创建一个新列Python 替换屏蔽数据帧内的NaN,python,pandas,Python,Pandas,这将创建一个新列c,其中mask1为False,列a中mask1为True。现在我在不同的条件下将b添加到c some_dict = {'a': [1,2,3,4], 'b': [5,6,7,8],} df = pd.DataFrame(some_dict) mask1 = pd.Series([False, True, False, True]) df['c'] = df.loc[mask1, 'a'] 但是,这会将所有值都设置为NaN。我猜这是因为NaN+0和0+NaN都等于NaN。我试图
c
,其中mask1
为False
,列a
中mask1
为True
。现在我在不同的条件下将b
添加到c
some_dict = {'a': [1,2,3,4], 'b': [5,6,7,8],}
df = pd.DataFrame(some_dict)
mask1 = pd.Series([False, True, False, True])
df['c'] = df.loc[mask1, 'a']
但是,这会将所有值都设置为NaN。我猜这是因为NaN+0
和0+NaN
都等于NaN
。我试图通过写作来解决这个问题
mask2 = pd.Series([True, False, False, False])
df['c'] += df.loc[mask2, 'b']
为什么通过
fillna()
将NaN
替换为0
不起作用?如果检查如何仅为不匹配的行添加缺少的值-掩码中的假值:
df['c'] = df.loc[mask1, 'a'].fillna(0)
df['c'] = df.loc[mask2, 'b'].fillna(0)
因此,如果要替换NaN,则不存在缺失值,因此无法执行:
print (df.loc[mask1, 'a'])
1 2
3 4
Name: a, dtype: int64
如果指定给列,则也必须创建不匹配的值-因为不知道应该创建什么NaN
s:
print (df.loc[mask1, 'a'].fillna(0))
1 2
3 4
Name: a, dtype: int64
另一种选择是:
总而言之:
df['c'] = df['a'].where(mask1, 0)
print (df)
a b c
0 1 5 0
1 2 6 2
2 3 7 0
3 4 8 4
另一个想法是使用fill\u value=0
:
some_dict = {'a': [1,2,3,4], 'b': [5,6,7,8],}
df = pd.DataFrame(some_dict)
mask1 = pd.Series([False, True, False, True])
df['c'] = np.where(mask1, df['a'], 0)
mask2 = pd.Series([True, False, False, False])
df['c'] += np.where(mask2, df['b'], 0)
print (df)
a b c
0 1 5 5
1 2 6 2
2 3 7 0
3 4 8 4
如果检查如何仅为不匹配的行添加缺少的值-掩码中的假值:
df['c'] = df.loc[mask1, 'a'].fillna(0)
df['c'] = df.loc[mask2, 'b'].fillna(0)
因此,如果要替换NaN,则不存在缺失值,因此无法执行:
print (df.loc[mask1, 'a'])
1 2
3 4
Name: a, dtype: int64
如果指定给列,则也必须创建不匹配的值-因为不知道应该创建什么NaN
s:
print (df.loc[mask1, 'a'].fillna(0))
1 2
3 4
Name: a, dtype: int64
另一种选择是:
总而言之:
df['c'] = df['a'].where(mask1, 0)
print (df)
a b c
0 1 5 0
1 2 6 2
2 3 7 0
3 4 8 4
另一个想法是使用fill\u value=0
:
some_dict = {'a': [1,2,3,4], 'b': [5,6,7,8],}
df = pd.DataFrame(some_dict)
mask1 = pd.Series([False, True, False, True])
df['c'] = np.where(mask1, df['a'], 0)
mask2 = pd.Series([True, False, False, False])
df['c'] += np.where(mask2, df['b'], 0)
print (df)
a b c
0 1 5 5
1 2 6 2
2 3 7 0
3 4 8 4
尝试始终将左值的索引与右值的索引相匹配。否则,熊猫会在进行手术前尽最大努力重新编制这两个项目的索引 此外,在进行步幅分配之前,始终将新列显式设置为您选择的某个默认值,例如0(它还将为您提供正确的
dtype
)
因此,具体而言:
some_dict = {'a': [1,2,3,4], 'b': [5,6,7,8],}
df = pd.DataFrame(some_dict)
mask1 = pd.Series([False, True, False, True])
df['c'] = df.loc[mask1, 'a']
print (df)
a b c
0 1 5 NaN
1 2 6 2.0
2 3 7 NaN
3 4 8 4.0
mask2 = pd.Series([True, False, False, False])
df['c'] = df['c'].add(df.loc[mask2, 'b'], fill_value=0)
print (df)
a b c
0 1 5 5.0
1 2 6 2.0
2 3 7 NaN
3 4 8 4.0
尝试始终将左值的索引与右值的索引相匹配。否则,熊猫会在进行手术前尽最大努力重新编制这两个项目的索引 此外,在进行步幅分配之前,始终将新列显式设置为您选择的某个默认值,例如0(它还将为您提供正确的
dtype
)
因此,具体而言:
some_dict = {'a': [1,2,3,4], 'b': [5,6,7,8],}
df = pd.DataFrame(some_dict)
mask1 = pd.Series([False, True, False, True])
df['c'] = df.loc[mask1, 'a']
print (df)
a b c
0 1 5 NaN
1 2 6 2.0
2 3 7 NaN
3 4 8 4.0
mask2 = pd.Series([True, False, False, False])
df['c'] = df['c'].add(df.loc[mask2, 'b'], fill_value=0)
print (df)
a b c
0 1 5 5.0
1 2 6 2.0
2 3 7 NaN
3 4 8 4.0
我希望将列
b
中的值添加到列c
,但仅当mask2
为true时。如果为False,则只需添加任何内容。@armara-则只需添加任何内容。
-而中的任何内容都不是NaN
;)我想你需要添加0
?是的,我不是指添加NaN
,我是指在0
中不添加任何内容,尝试始终将左值的索引与右值的索引相匹配。否则,熊猫会在进行手术前尽最大努力重新编制这两个项目的索引。请参阅我的答案,以获得一种简洁而正确的方法。我希望将b
列中的值添加到c
列中,但仅当mask2
为真时。如果为False,则只需添加任何内容。@armara-则只需添加任何内容。
-而中的任何内容都不是NaN
;)我想你需要添加0
?是的,我不是指添加NaN
,我是指在0
中不添加任何内容,尝试始终将左值的索引与右值的索引相匹配。否则,熊猫会在进行手术前尽最大努力重新编制这两个项目的索引。请参阅我的答案,以获得一种简洁而恰当的方法。谢谢!:Dnp.
有魔力的地方,熊猫中没有等价的功能吗?@armara-你可以使用df['c']=df['a']。其中(mask1,0)
。顺便说一句,如果需要+NaN
值,则需要.add
,添加到答案的末尾。@armara当然:@PierreD-或此处-处理一列谢谢!:Dnp.
有魔力的地方,熊猫中没有等价的功能吗?@armara-你可以使用df['c']=df['a']。其中(mask1,0)
。顺便说一句,如果需要+NaN
值,则需要.add
,添加到答案末尾。@armara当然:@PierreD-或here-处理一列