我试图在两列中交换数据的子集,但我在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
答案 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"]