组合列并删除NaNs Pandas

时间:2016-02-11 21:44:09

标签: python pandas

如果我有像这样的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

2 个答案:

答案 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