【问题标题】:Pandas: Creating new column based on values from existing columnPandas:根据现有列的值创建新列
【发布时间】:2020-05-01 21:54:48
【问题描述】:

我有一个带有两列的 pandas 数据框,如下所示:

A      B
Yes    No
Yes    Yes
No     Yes
No     No
NA     Yes
NA     NA

我想根据这些值创建一个新列,这样如果任何列值是Yes,那么新列中的值也应该是Yes。如果两列的值都为No,则新列的值也为No。最后,如果两列的值都为NA,则新列的输出也将为NA。上述数据的示例输出为:

C
Yes
Yes
Yes
No
Yes
NA

我在数据帧的长度上编写了一个循环,然后检查每个值以获取一个新列。但是,10M 条记录需要很长时间。有没有更快的pythonic方法来实现这一点?

【问题讨论】:

  • 这似乎是非常基本的 Pandas 功能,这种情况有什么特别之处,这意味着基于该主题的大量可用信息无法解决?请参阅How to Askhelp center。顺便说一句,您是否真的使用字符串 "Yes"/"No" 而不是实际的布尔值?
  • 当然,这基本上是 stackoverflow.com/questions/19913659/… 的副本。

标签: python pandas


【解决方案1】:

有点像

df.fillna('').max(axis=1)
Out[106]: 
0    Yes
1    Yes
2    Yes
3     No
4    Yes
5       
dtype: object

【讨论】:

  • 非常好的解决方案!
【解决方案2】:

试试:

(df == 'Yes').eval('A | B').astype(str).mask(df['A'].isna() & df['B'].isna())

【讨论】:

  • 这会为“是”和“否”提供正确的输出,但不会为“NA”提供正确的输出,因为它将“NA”视为“否”。
【解决方案3】:

另一种方式。虽然是硬线

conditions=((df['A']=='Yes')|(df['B']=='Yes'),(df['A']=='No')&(df['B']=='No'),(df['A']=='NaN')&(df['B']=='NaN'))
choicelist=('Yes','No','NaN')
df['C']=np.select(conditions, choicelist)
df

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 2021-09-19
    • 1970-01-01
    • 2019-04-17
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多