我有一个带有两列的数据框:我使用数据透视表创建的Account,Bought Food将每个帐户压缩成一行。现在它向我展示了作为数字购买的总食物,但是我可以改变数据以显示只有整数的'Y'(我已经使用fillna函数替换NaN w / No)。
示例:
电流: AcctNo BoughtFood 1ABC 5 2ABD N. 3DBC 7
需要: AcctNo BoughtFood 1ABC Y. 2ABD N. 3DBC Y
答案 0 :(得分:2)
按to_numeric
+ notnull
或apply
+ isinstance
创建布尔值掩码:
#if all data strings, also numeric
m = pd.to_numeric(df['BoughtFood'], errors='coerce').notnull()
#if mixed df - numeric with strings
m = ~df['BoughtFood'].apply(lambda x: isinstance(x, str))
#or
m = df['BoughtFood'].apply(lambda x: isinstance(x, (int, float)))
df.loc[m, 'BoughtFood'] = 'T'
print (df)
AcctNo BoughtFood
0 1ABC T
1 2ABD N
2 3DBC T
df['BoughtFood'] = df['BoughtFood'].mask(m, 'T')
print (df)
AcctNo BoughtFood
0 1ABC T
1 2ABD N
2 3DBC T
多列解决方案:
cols = ['BoughtFood','BoughtWater']
m = df[cols].apply(lambda x: pd.to_numeric(x, errors='coerce')).notnull()
df[cols] = df[cols].mask(m, 'T')
print (df)
AcctNo BoughtFood BoughtWater
0 1ABC T N
1 2ABD N T
2 3DBC T T