Pandas根据多个列计算逻辑OR

时间:2015-12-26 01:26:34

标签: python pandas

这是我正在研究的DataFrame

{'Recipe@123': ['AAA', nan, nan],
 'Recipe@234': [nan, 'BBB', nan],
 'Recipe@456': [nan, nan, 'CCC'],
'Operation@123':[1,nan,nan],
'Operation@234':[nan,2,nan],
'Operation@456':[nan,nan, 3]
}

我正在尝试根据行值创建一个不包含Recipe配方的NaN列。 例如,第一行值为AAA,第二行 - BBB等.DF中还有其他列,但Recipe列应仅考虑提及的3列。

2 个答案:

答案 0 :(得分:4)

一个简单的解决方案是:

df = pd.DataFrame({'Recipe@123': ['AAA', np.nan, np.nan], 'Recipe@234': [np.nan, 'BBB', np.nan], 'Recipe@456': [np.nan, np.nan, 'CCC'], 'other_col': [1, 2, 3]})

  Recipe@123 Recipe@234 Recipe@456  other_col
0        AAA        NaN        NaN          1
1        NaN        BBB        NaN          2
2        NaN        NaN        CCC          3

只需遍历rows并使用.dropna删除缺失值,您可以将其写入新的DataFrame列,如下所示:

for i, data in df.iterrows():
    df.loc[i, 'Recipe'] = data[['Recipe@123', 'Recipe@234', 'Recipe@456']].dropna().values[0]

  Recipe@123 Recipe@234 Recipe@456  other_col Recipe
0        AAA        NaN        NaN          1    AAA
1        NaN        BBB        NaN          2    BBB
2        NaN        NaN        CCC          3    CCC

答案 1 :(得分:1)

如果您只有一个有效值且所有其他值都是axis=1,那么您可以applyNaN一起使用any方法申请行(使用@Stefan示例):

In [197]: df
Out[197]: 
  Recipe@123 Recipe@234 Recipe@456  other_col
0        AAA        NaN        NaN          1
1        NaN        BBB        NaN          2
2        NaN        NaN        CCC          3

In [199]: df['new'] = df[['Recipe@123', 'Recipe@234', 'Recipe@456']].apply(lambda x: x.any(), axis=1)

In [200]: df
Out[200]: 
  Recipe@123 Recipe@234 Recipe@456  other_col  new
0        AAA        NaN        NaN          1  AAA
1        NaN        BBB        NaN          2  BBB
2        NaN        NaN        CCC          3  CCC

修改

这看起来有点像黑客,但我认为这应该有用(如果min是数字dtype,则调用any):

 df['new'] = df[['Operation@123', 'Operation@234', 'Operation@456']].apply(lambda x: x.min() if x.dtype.kind in 'biufc' else x.any(), axis=1)

In [551]: df
Out[551]: 
   Operation@123  Operation@234  Operation@456 Recipe@123 Recipe@234  \
0              1            NaN            NaN        AAA        NaN   
1            NaN              2            NaN        NaN        BBB   
2            NaN            NaN              3        NaN        NaN   

  Recipe@456  new  
0        NaN    1  
1        NaN    2  
2        CCC    3  

注意dtype.kind