如果我有像这样的pandas数据框:
a1 0.116667 NaN NaN
a2 NaN 0.516667 NaN
a3 NaN 0.006667 NaN
a4 NaN NaN 0.426667
a5 NaN 0.506667 NaN
a6 0.583333 NaN NaN
a7 0.550000 NaN NaN
我想组合列,这样如果任何列中都有数字,而另外两列中有NaN,结果就是一列,并带有预期的输出:
a1 0.116667
a2 0.516667
a3 0.006667
a4 0.426667
a5 0.506667
a6 0.583333
a7 0.550000
答案 0 :(得分:2)
如果对于某些行,有两个或更多值不是NaN
s,那么您没有指定会发生什么。
在这种情况下,根据您的需要,一个简单的行最大值可能会解决您的问题:
df = pd.DataFrame({
'a': [1, None, None],
'b': [None, 3, None],
'c': [None, None, 4]})
>>> df
a b c
0 1 NaN NaN
1 NaN 3 NaN
2 NaN NaN 4
现在,采用行最大值:
>>> df.max(axis=1)
0 1
1 3
2 4
dtype: float64
答案 1 :(得分:1)
您可以创建一个遮罩,其中给定行中的空值数等于2。然后使用掩码对其他列求和。
df = pd.DataFrame({'cat': ['a' + str(i) for i in range(1, 8)],
'col1': [0.116667, np.nan, np.nan, np.nan, np.nan, 0.583333, 0.550000],
'col2': [np.nan, 0.516667, 0.006667, np.nan, 0.506667, np.nan, np.nan],
'col3': [np.nan, np.nan, np.nan, 0.426667, np.nan, np.nan, np.nan]})
>>> df
cat col1 col2 col3
0 a1 0.116667 NaN NaN
1 a2 NaN 0.516667 NaN
2 a3 NaN 0.006667 NaN
3 a4 NaN NaN 0.426667
4 a5 NaN 0.506667 NaN
5 a6 0.583333 NaN NaN
6 a7 0.550000 NaN NaN
mask = df.isnull().sum(axis=1) == 2
df.loc[mask, 'col1'] = df[mask].sum(axis=1)
>>> df
cat col1 col2 col3
0 a1 0.116667 NaN NaN
1 a2 0.516667 0.516667 NaN
2 a3 0.006667 0.006667 NaN
3 a4 0.426667 NaN 0.426667
4 a5 0.506667 0.506667 NaN
5 a6 0.583333 NaN NaN
6 a7 0.550000 NaN NaN