将规则应用于熊猫中具有外部条件的列

时间:2018-08-10 07:45:47

标签: python pandas

我有一个由三列组成的表格:第一个是字母,第二和第三个是数字。 我想在A列中有一个'c'时将B列除以C列。否则返回B的值。

示例:

A = np.random.choice(['c', 'p'], size = 10)
B = np.random.rand(10)
C = np.random.rand(10)
D = np.array(list(zip(A, B, C)))

D= pd.DataFrame(D, columns = ['A', 'B','C'])
D

我尝试使用np.where(D['A']== 'p', D['B']/D['C'], D['B']),但返回错误。

2 个答案:

答案 0 :(得分:1)

您可以直接从字典中初始化数据框。

>>> A = np.random.choice(['c', 'p'], size = 10)
>>> B = np.random.rand(10)
>>> C = np.random.rand(10)
>>> D = pd.DataFrame({"A":A, "B":B, "C":C})
>>> D.apply(lambda row: row["C"]/row["B"] if row['A'] == "c"  else row['B'], axis=1)
       A         B         C
0  c  0.059202  0.582464
1  p  0.616223  0.918981
2  c  0.004744  0.612056
3  p  0.841413  0.501560
4  c  0.847137  0.028005
5  p  0.352703  0.043995
6  c  0.651796  0.778321
7  p  0.687776  0.870029
8  c  0.652986  0.682864
9  p  0.111138  0.587294

np.array保存具有相同数据类型的对象。因此,如 docs

  

dtype:数据类型,可选

     

所需的数组数据类型。如果未给出,则将类型确定为将对象保留在其中所需的最小类型。   序列。此参数只能用于“上载”阵列。   对于向下转换,请使用.astype(t)方法。

答案 1 :(得分:0)

解决方案如下:

A = np.random.choice(['c', 'p'], size = 10)
B = np.random.rand(10)
C = np.random.rand(10)
D = np.array(list(zip(A, B, C)))

D= pd.DataFrame(D, columns = ['A', 'B','C'])
D['B'] = D['B'].apply(float)
D['C'] = D['C'].apply(float)

B和C列转换为字符串。有人知道为什么吗?