Pandas - 仅当 MULTIPLE COLUMNs 为空时才用另一列的值填充一列

纳文·库马尔

我有一个像这样的 Pandas DataFrame:

   a      b    c      x    a1     b1     c1     x1
0  aa    ba   ca      9    NaN    NaN    NaN    1
1  ab    bb   cb      9    NaN    NaN    NaN    NaN
2  ac    bc   cd    NaN    NaN    NaN    NaN    NaN
3  ad    bd   cd      9    1      NaN    NaN    NaN
4  ae    be   ce      9    NaN    2      NaN    12
5  af    bf   cf      9    NaN    NaN    3      14
6  ag    bg   cg      9    3      NaN    1      45

我想要做:

   a      b    c      x    a1     b1     c1     x1
0  aa    ba   ca      9    NaN    NaN    NaN    1
1  ab    bb   cb      9    NaN    NaN    NaN    9
2  ac    bc   cc    NaN    NaN    NaN    NaN    NaN
3  ad    bd   cd      9    1      NaN    NaN    NaN
4  ae    be   ce      9    NaN    2      NaN    12
5  af    bf   cf      9    NaN    NaN    3      14
6  ag    bg   cg      9    3      NaN    1      45

解释:

第 0 行:我不希望替换发生,当 中已经存在值时x1,甚至当所有a1,b1c1都是NaNs 时。1和2行:我要填写栏x1与无论是在x,只有只有当列a1b1并且c1NaN秒。
行3,4,5和6:我想列x1留为是,当任何一个或从两列a1b1并且c1NaN秒。

有没有一种有效的方法来做这个操作?


我已经尝试过如thisthis stackoverflow答案所示,但我收到广播错误,大概是因为我试图对多列进行检查。

这是我尝试过的:

np.where(np.isnan(df[['a1', 'b1', 'c1']].values), df['x'].values, df['x1'].values)

和我的错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-32-bb6a0f9faf18> in <module>
----> 1 np.where(np.isnan(df[['a', 'b', 'c']].values), df['x'].values, df['x1'].values)

<__array_function__ internals> in where(*args, **kwargs)

ValueError: operands could not be broadcast together with shapes (176213,6) (176213,) (176213,) 
亨利·埃克

一种选择是any在轴=1 上使用:

df['x1'] = np.where(df[['a1', 'b1', 'c1', 'x1']].any(axis=1), df['x1'], df['x'])

df

    a   b   c    x   a1   b1   c1    x1
0  aa  ba  ca  9.0  NaN  NaN  NaN   1.0
1  ab  bb  cb  9.0  NaN  NaN  NaN   9.0
2  ac  bc  cd  NaN  NaN  NaN  NaN   NaN
3  ad  bd  cd  9.0  1.0  NaN  NaN   NaN
4  ae  be  ce  9.0  NaN  2.0  NaN  12.0
5  af  bf  cf  9.0  NaN  NaN  3.0  14.0
6  ag  bg  cg  9.0  3.0  NaN  1.0  45.0

通过@Jon Clements♦ 的另一种选择

df.loc[~df[['a1', 'b1', 'c1', 'x1']].any(1), 'x1'] = df['x']

否定any而不是使用的原因all是,any将认为NaN是假的,而all认为NaN是真:

pd.Series([np.nan, np.nan]).any()  # False
pd.Series([np.nan, np.nan]).all()  # True

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

仅当特定列至少包含另一列的一个单词时,才从 Dataframe2 合并 Dataframe1 的 Python/Pandas 中的列

从另一列创建一列列表,并在 Pandas 数据框中仅显示唯一值

仅当另一列的值为DAX时,PowerBi才计算日期

仅当另一列的值为负时,Postgres 才选择最大 ID

从 Pandas Dataframe 中选择一列中具有相同值而另一列中仅丢失的行

仅当满足另一列的条件时才填写

MySQL:仅当另一列中的值唯一时才设置值

仅当另一列在R中具有良好的值时,才连续列的总和

仅当另一列的值满足条件时才获取列的分位数

从插入的表中为不为空的列选择记录,并且仅当另一列为 Y 时,列才不为空

仅当另一列的值更改SQL Server时才自动增加该值

仅当一列没有值时,Pandas DataFrame才会从另一个数据框中更新

仅当存在前一行具有空值时才向前填充数据框中的一列

Pandas Dataframe仅按一列过滤行

如何仅汇总一列Pandas Python 2.7

SQL:仅当在同一行中另一列具有不同的值时,才返回一列的值

Pandas :将权重应用于另一列,仅适用于某些 id

SQL Server:仅当同一表中的另一列是特定值时,才如何强制在一列中使用NOT NULL?

SQL Access,仅当另一列中的所有值都在指定范围内时,才求和一列的值

根据另一列中的值填充一列-Pandas

仅当另一列的计数大于零时,才从表中选择一列

如何仅当给定值存在于 Excel 的另一列中时才替换值

仅当其中一列为真时才向多列添加约束

仅当另一列具有特定值时才恢复表上的更新更改的 SQL 触发器

用另一列Pandas DataFrame替换一列中的值

用pandas数据框另一列中的值替换空列表

Pandas df:用另一列中的特定值填充新列中的值(多列條件)

如果另一列中的值为空,则删除重复项-Pandas

SQL - 仅当另一列匹配时才删除重复列