Python 熊猫:取非南的那一列
我使用的是一个相当混乱的数据集,它是名称稍有不同的单个csv文件。重命名csv文件中的列太麻烦了,部分原因是我仍在发现所有的变化,因此我希望确定给定行中的一组列的哪个字段不是NaN,并将其转发到新列。有办法吗 这是一个很好的例子。假设我有一个如下所示的数据帧: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 假设我的期望输出是创建一个新的
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