Pandas 根据条件交换列
Pandas swap columns based on condition
我有一个 pandas 数据框,如下所示:
Col1 Col2 Col3
0 A 7 NaN
1 B 16 NaN
1 B 16 15
我想做的是将 Col2 与 Col3 交换,其中 Col3 的值为 NaN
。根据 SO 上的其他帖子和答案,到目前为止我有这段代码:
df[['Col2', 'Col3']] = df[['Col3', 'Col2']].where(df[['Col3']].isnull())
但这似乎无法正常工作,并给了我以下信息:
Col1 Col2 Col3
0 A NaN NaN
1 B NaN NaN
1 B NaN NaN
这里有什么我可能遗漏的吗?
更新: 我想要的输出如下:
Col1 Col2 Col3
0 A NaN 7
1 B NaN 16
1 B 16 15
谢谢
您可以使用 loc
进行交换:
df.loc[df['Col3'].isnull(), ['Col2', 'Col3']] = df.loc[df['Col3'].isnull(), ['Col3', 'Col2']].values
请注意 .values
是确保交换正确完成所必需的,否则 Pandas 将尝试根据索引和列名对齐,并且不会发生交换。
如果您觉得代码更简洁,您也可以单独重新分配每一行:
null_idx = df['Col3'].isnull()
df.loc[null_idx, 'Col3'] = df['Col2']
df.loc[null_idx, 'Col2'] = np.nan
结果输出:
Col1 Col2 Col3
0 A NaN 7.0
1 B NaN 16.0
2 B 16.0 15.0
试试这个:(速度更快)
df["Col3"], df["Col2"] = np.where(df['Col3'].isnull(), [df["Col2"], df["Col3"]], [df["Col3"], df["Col2"] ])
df
Col1 Col2 Col3
0 A NaN 7.0
1 B NaN 16.0
1 B 16.0 15.0
%timeit df.loc[df['Col3'].isnull(), ['Col2', 'Col3']] = df.loc[df['Col3'].isnull(), ['Col3', 'Col2']].values
100 loops, best of 3: 2.68 ms per loop
%timeit df["Col3"], df["Col2"] = np.where(df['Col3'].isnull(), [df["Col2"], df["Col3"]], [df["Col3"], df["Col2"] ])
1000 loops, best of 3: 592 µs per loop
我有一个 pandas 数据框,如下所示:
Col1 Col2 Col3
0 A 7 NaN
1 B 16 NaN
1 B 16 15
我想做的是将 Col2 与 Col3 交换,其中 Col3 的值为 NaN
。根据 SO 上的其他帖子和答案,到目前为止我有这段代码:
df[['Col2', 'Col3']] = df[['Col3', 'Col2']].where(df[['Col3']].isnull())
但这似乎无法正常工作,并给了我以下信息:
Col1 Col2 Col3
0 A NaN NaN
1 B NaN NaN
1 B NaN NaN
这里有什么我可能遗漏的吗?
更新: 我想要的输出如下:
Col1 Col2 Col3
0 A NaN 7
1 B NaN 16
1 B 16 15
谢谢
您可以使用 loc
进行交换:
df.loc[df['Col3'].isnull(), ['Col2', 'Col3']] = df.loc[df['Col3'].isnull(), ['Col3', 'Col2']].values
请注意 .values
是确保交换正确完成所必需的,否则 Pandas 将尝试根据索引和列名对齐,并且不会发生交换。
如果您觉得代码更简洁,您也可以单独重新分配每一行:
null_idx = df['Col3'].isnull()
df.loc[null_idx, 'Col3'] = df['Col2']
df.loc[null_idx, 'Col2'] = np.nan
结果输出:
Col1 Col2 Col3
0 A NaN 7.0
1 B NaN 16.0
2 B 16.0 15.0
试试这个:(速度更快)
df["Col3"], df["Col2"] = np.where(df['Col3'].isnull(), [df["Col2"], df["Col3"]], [df["Col3"], df["Col2"] ])
df
Col1 Col2 Col3
0 A NaN 7.0
1 B NaN 16.0
1 B 16.0 15.0
%timeit df.loc[df['Col3'].isnull(), ['Col2', 'Col3']] = df.loc[df['Col3'].isnull(), ['Col3', 'Col2']].values
100 loops, best of 3: 2.68 ms per loop
%timeit df["Col3"], df["Col2"] = np.where(df['Col3'].isnull(), [df["Col2"], df["Col3"]], [df["Col3"], df["Col2"] ])
1000 loops, best of 3: 592 µs per loop