这是我正在研究的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列。
答案 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
,那么您可以apply
与NaN
一起使用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