我的数据框示例。
np.random.seed(66)
df = pd.DataFrame(
np.random.rand(5, 3),
columns=list('ABC'),
index=['R{}'.format(i) for i in range(5)]
)
df[df < .5] = None
df.head()
A B C
R0 NaN NaN NaN
R1 0.67 NaN NaN
R2 0.75 0.55 0.51
R3 NaN NaN 0.82
R4 NaN NaN 0.67
一栏解决方案
df['A_percent'] = (df.loc[df['A'].notnull(),['A']] * 100).astype(np.int32)
df.head()
A B C A_percent
R0 NaN NaN NaN NaN
R1 0.67 NaN NaN 67.0
R2 0.75 0.55 0.51 75.0
R3 NaN NaN 0.82 NaN
R4 NaN NaN 0.67 NaN
当我尝试对多列进行相同操作时,一切都会中断
df['A_percent', 'B_percent'] = (df.loc[df['A', 'B'].notnull(),['A', 'B']] * 100).astype(np.int32)
可以一次完成吗?
答案 0 :(得分:2)
您可以使用numpy.floor
,然后应删除布尔掩码:
df[['A_percent', 'B_percent']] = np.floor(df[['A', 'B']] * 100)
print (df)
A B C A_percent B_percent
R0 NaN NaN NaN NaN NaN
R1 0.679109 NaN NaN 67.0 NaN
R2 0.758416 0.557619 0.514803 75.0 55.0
R3 NaN NaN 0.829095 NaN NaN
R4 NaN NaN 0.678006 NaN NaN
您应该更改解决方案,方法是将缺失的值替换为一些数字,例如0
,因此有可能转换为integer
并在新列中使用DataFrame.where
:
mask = df[['A','B']].notnull()
df1 = (df[['A','B']].fillna(0)*100).astype(np.int32)
df[['A_percent', 'B_percent']] = df1.where(mask)
print (df)
A B C A_percent B_percent
R0 NaN NaN NaN NaN NaN
R1 0.679109 NaN NaN 67.0 NaN
R2 0.758416 0.557619 0.514803 75.0 55.0
R3 NaN NaN 0.829095 NaN NaN
R4 NaN NaN 0.678006 NaN NaN