交换列数据的某些子集

时间:2018-04-04 11:40:03

标签: pandas

我试图在两列中交换数据的子集,但我在SO上找到的所有方法都提供了完全交换,或者也交换了列名。这就是我想要的:

df = 
     a     b     c
0    1     2     3 
1    1     2     3
2    1     2     3
3    1     2     3

然后我创建一个随机掩码:

mask = np.random.choice([False, True], len(df), p=[0.5, 0.5])

应用掩码和交换,如果我交换df[mask]['a']df[mask]['b'],我希望结果如下所示:

df = 
     a     b     c
0    1     2     3 
1    2     1     3
2    1     2     3
3    2     1     3

实现这一结果的最佳方法是什么?我正在使用pandas 0.18.1

3 个答案:

答案 0 :(得分:2)

在一行中:

mask = np.random.choice([False, True], len(df), p=[0.5, 0.5])

df.loc[mask, ['a', 'b']] = df.loc[mask, ['b', 'a']].values

答案 1 :(得分:1)

numpy.where的解决方案:

mask = np.random.choice([False, True], len(df), p=[0.5, 0.5])

df[['b', 'a']] = np.where(mask[:, None], df[['b', 'a']], df[['a', 'b']])
print (df)
   a  b  c
0  1  2  3
1  2  1  3
2  2  1  3
3  2  1  3

答案 2 :(得分:0)

你可以试试这个

import pandas as pd
import numpy as np
df = pd.DataFrame({"a":[1]*4, "b":[2]*4})
mask = np.random.choice([False, True], len(df), p=[0.5, 0.5])
df["a_bk"] = df["a"].copy()
df["a"] = np.where(mask, df["b"], df["a"])
df["b"] =  np.where(mask, df["a"], df["b"])
del df["a_bk"]