我有一个数据框架,我想对除第一列外的每一列应用一个简单的函数。以下面的例子为例—尽管实际上我的数据框架包含数百列:
vals = [(0, 12, 0),
(33, 0, 11),
(44, 16, 21),
(0, 32, 1),
(66, 33, 27),
(77, 0, 0)
]
df = pd.DataFrame(vals, columns=list('ABC'))
我想找到一种方法,我可以建立一个规则,每个大于0的值都被1取代。关键的是,我不想将此规则应用于第一列,它应该保持原样。
我得到的最接近的是一个lambda函数,它根本不工作:
df = df.apply(lambda x: 1 if x > 0 else 0 if x.name != 'A' else x)
当使用apply
方法时,应用的函数将接收所有整个列(默认情况下,如果axis=0
),或者它将接收整个行(axis=1
)。在您的示例中,lambda函数是一个元素函数,这就是您需要使用applymap
方法的原因。
df[['B', 'C']] = df[['B', 'C']].applymap(lambda x: 1 if x > 0 else 0)
你可以这样做:
>>> cols = ['B','C']
>>> df[cols] = df[cols].gt(0).astype(int)
>>> df
A B C
0 0 1 0
1 33 0 1
2 44 1 1
3 0 1 1
4 66 1 1
5 77 0 0
您可以将cols
更改为df.columns[1:]
之类的更一般的情况。