Python 熊猫:取非南的那一列

Python 熊猫:取非南的那一列,python,pandas,Python,Pandas,我使用的是一个相当混乱的数据集,它是名称稍有不同的单个csv文件。重命名csv文件中的列太麻烦了,部分原因是我仍在发现所有的变化,因此我希望确定给定行中的一组列的哪个字段不是NaN,并将其转发到新列。有办法吗 这是一个很好的例子。假设我有一个如下所示的数据帧: Index A B 1 15 NaN 2 NaN 11 3 NaN 99 4 NaN NaN 5 12 14 假设我的期望输出是创建一个新的

我使用的是一个相当混乱的数据集,它是名称稍有不同的单个csv文件。重命名csv文件中的列太麻烦了,部分原因是我仍在发现所有的变化,因此我希望确定给定行中的一组列的哪个字段不是NaN,并将其转发到新列。有办法吗

这是一个很好的例子。假设我有一个如下所示的数据帧:

Index   A     B
1       15    NaN
2       NaN   11
3       NaN   99
4       NaN   NaN
5       12    14
假设我的期望输出是创建一个新的列C,这样我的数据帧将如下所示:

Index   A     B       C
1       15    NaN     15
2       NaN   11      11
3       NaN   99      99
4       NaN   NaN     NaN
5       12    14      12 (so giving priority to A over B)

我怎样才能做到这一点呢?

如果你只有两列,最干净的方法就是使用
where
(语法是
where([condition],[value If condition is true],[value If condition is false])
(出于某种原因,我花了一些时间才明白这一点)

如果您有两个以上的列,则使用
max
min
可能会更简单;这将忽略空值,但您将丢失所需的“列优先顺序”:

In [3]: df.max(axis=1)
Out[3]:
0    15.0
1    11.0
2    99.0
3     NaN
4    14.0
dtype: float64

对于具有任意列数的数据帧,您可以反填充行(
.bfill(axis=1)
)并获取第一列(
.iloc[:,0]
):

:


或者您可以使用“df.apply”来优先考虑列A

def func1(row):
    A=row['A']
    B=row['B']
    if A==float('nan'):
       if B==float('nan'):
          y=float('nan')
       else:
          y=B
    else:
       y=A
    return y
df['C']=df.apply(func1,axis=1)
尝试以下方法:(这种方法允许灵活地优先选择列,而不依赖列的顺序。)

使用@Alexanders设置

df["D"] = df["B"]
df["D"] = df['D'].fillna(df['A'].fillna(df['B'].fillna(df['C'])))

      A     B     C     D
0  15.0   NaN  10.0  15.0
1   NaN  11.0   NaN  11.0
2   NaN  99.0  10.0  99.0
3   NaN   NaN  10.0  10.0
4  12.0  14.0  10.0  14.0
df['updated'] = np.nan
for col in df.columns:
    df['updated'].update(df[col])
def func1(row):
    A=row['A']
    B=row['B']
    if A==float('nan'):
       if B==float('nan'):
          y=float('nan')
       else:
          y=B
    else:
       y=A
    return y
df['C']=df.apply(func1,axis=1)
df["D"] = df["B"]
df["D"] = df['D'].fillna(df['A'].fillna(df['B'].fillna(df['C'])))

      A     B     C     D
0  15.0   NaN  10.0  15.0
1   NaN  11.0   NaN  11.0
2   NaN  99.0  10.0  99.0
3   NaN   NaN  10.0  10.0
4  12.0  14.0  10.0  14.0