pandas 如何按条件交换特定帧中DataFrame列中的数据?

aemubtdh  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(77)

例如,我有下一个 Dataframe :

data = [{'name': 'test', 'x': 'test', 'y': 'test', 'name_2': np.NaN, 'x_2': np.NaN, 'y_2': np.NaN}, {'name': 'test', 'x': 'test', 'y': 'test', 'name_2': np.NaN, 'x_2': np.NaN, 'y_2': np.NaN}, {'name': 'test', 'x': 'test', 'y': 'test', 'name_2': np.NaN, 'x_2': np.NaN, 'y_2': np.NaN}, {'name': 'test', 'x': 'test', 'y': 'test', 'name_2': 'test', 'x_2': 'test', 'y_2': 'test'}, {'name': 'test', 'x': 'test', 'y': 'test', 'name_2': 'test', 'x_2': 'test', 'y_2': 'test'}, {'name': 'test', 'x': 'test', 'y': 'test', 'name_2': 'test', 'x_2': 'test', 'y_2': 'test'}, {'name': 'test', 'x': 'test', 'y': 'test', 'name_2': 'test', 'x_2': 'test', 'y_2': 'test'}, {'name': np.NaN, 'x': np.NaN, 'y': np.NaN, 'name_2': 'test', 'x_2': 'test', 'y_2': 'test'}, {'name': np.NaN, 'x': np.NaN, 'y': np.NaN, 'name_2': 'test', 'x_2': 'test', 'y_2': 'test'}, {'name': np.NaN, 'x': np.NaN, 'y': np.NaN, 'name_2': 'test', 'x_2': 'test', 'y_2': 'test'}]

df = pd.DataFrame(data)
    print(df)

如何在不使用剪切为两个 Dataframe 的情况下,在使用连接后交换此 Dataframe 中的数据?
如果列-〉name, x, y中的所有三个值都是NaN,则应根据条件进行替换
我尝试得到下一个结果:

ee7vknir

ee7vknir1#

我们可以一步一步来

l = ['name','x','y']
s = ['name_2','x_2','y_2']
cond = df[l].isna().all(1)
df.loc[cond,l] = df.loc[cond,s].values
df.loc[cond,s] = np.nan
df
Out[57]: 
   name     x     y name_2   x_2   y_2
0  test  test  test    NaN   NaN   NaN
1  test  test  test    NaN   NaN   NaN
2  test  test  test    NaN   NaN   NaN
3  test  test  test   test  test  test
4  test  test  test   test  test  test
5  test  test  test   test  test  test
6  test  test  test   test  test  test
7  test  test  test    NaN   NaN   NaN
8  test  test  test    NaN   NaN   NaN
9  test  test  test    NaN   NaN   NaN
bmvo0sr5

bmvo0sr52#

在一个相当类似的脉络,你可以尝试:

# First we create a boolean series of all rows that need to be changed
m = df[['name', 'x', 'y']].isna().all(axis=1)

df[['name', 'x', 'y']] = df[['name', 'x', 'y']].mask(m, df[['name_2', 'x_2', 'y_2']].to_numpy())
df[['name_2', 'x_2', 'y_2']] = df[['name_2', 'x_2', 'y_2']].mask(m, np.NaN)

   name     x     y name_2   x_2   y_2
0  test  test  test    NaN   NaN   NaN
1  test  test  test    NaN   NaN   NaN
2  test  test  test    NaN   NaN   NaN
3  test  test  test   test  test  test
4  test  test  test   test  test  test
5  test  test  test   test  test  test
6  test  test  test   test  test  test
7  test  test  test    NaN   NaN   NaN
8  test  test  test    NaN   NaN   NaN
9  test  test  test    NaN   NaN   NaN

相关问题