熊猫数据框。根据其他列的非空值添加多个列

时间:2019-02-23 08:41:53

标签: python pandas dataframe

我的数据框示例。

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)

可以一次完成吗?

1 个答案:

答案 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