根据pandas中的第四列,将数据从一列移动到另一列中的一列

时间:2017-10-30 09:26:14

标签: python pandas numpy dataframe

所以在Pandas中我有以下数据框

A B C D
0 X   
1 Y   
0 Y   
1 Y   
0 X
1 X    

我希望将A中的值移动到C或D,具体取决于B.输出应该是这样的;

A B C D
0 X 0 
1 Y   1 
0 Y   0
1 Y   1 
0 X 0
1 X 1  

我尝试过使用多个where语句,比如

df['C'] = np.where(str(df.B).find('X'), df.A, '')
df['D'] = np.where(str(df.B).find('Y'), df.A, '')

但这导致了;

A B C D
0 X 0 0
1 Y 1 1 
0 Y 0 0
1 Y 1 1 
0 X 0 0
1 X 1 1 

所以我猜它正在检查列中是否存在值,这是有道理的。我需要逐行迭代吗?

2 个答案:

答案 0 :(得分:3)

请勿使用str转换为find,因为它会返回标量,0会转换为False而另一个整数会转换为True s:

print (str(df.B).find('X'))
5

最简单的是比较布尔值Series的值:

print (df.B == 'X')
0     True
1    False
2    False
3    False
4     True
5     True
Name: B, dtype: bool

df['C'] = np.where(df.B == 'X', df.A, '')
df['D'] = np.where(df.B == 'Y', df.A, '')

assign + where的另一种解决方案:

df = df.assign(C=df.A.where(df.B == 'X', ''),
               D=df.A.where(df.B == 'Y', ''))

如果需要检查子字符串,请使用str.contains

df['C'] = np.where(df.B.str.contains('X'), df.A, '')
df['D'] = np.where(df.B.str.contains('Y'), df.A, '')

或者:

df['C'] = df.A.where(df.B.str.contains('X'), '')
df['D'] = df.A.where(df.B.str.contains('Y'), '')

所有回报:

print (df)
   A  B  C  D
0  0  X  0   
1  1  Y     1
2  0  Y     0
3  1  Y     1
4  0  X  0   
5  1  X  1   

答案 1 :(得分:1)

使用切片分配

n = len(df)
f, u = pd.factorize(df.B.values)
a = np.empty((n, 2), dtype=object)
a.fill('')
a[np.arange(n), f] = df.A.values

df.loc[:, ['C', 'D']] = a

df

   A  B  C  D
0  0  X  0   
1  1  Y     1
2  0  Y     0
3  1  Y     1
4  0  X  0   
5  1  X  1