簡體   English   中英

如何通過map / apply在熊貓數據框上使用lambda函數,其中lambda為每一列取不同的值

[英]How to use lambda function on a pandas data frame via map/apply where lambda takes different values for each column

想法是根據特定於每一列的值以最快的方式轉換數據幀。 為簡單起見,下面是一個示例,其中將列的每個元素與其所屬的列的均值進行比較,如果大於mean(column),則將其替換為0,否則將其替換為1。

In [26]: df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6]]))                                                                                                                                                               

In [27]: df                                                                                                                                                                                                                
Out[27]: 
   0  1  2
0  1  2  3
1  4  5  6

In [28]: df.mean().values.tolist()                                                                                                                                                                                         
Out[28]: [2.5, 3.5, 4.5]

以下是片段,不是真正的代碼,而是更多地說明所需的行為。 我使用了apply方法,但是它可以是最快的方法。

In [29]: f = lambda x: 0 if x < means else 1                                                                                                                                                                               

In [30]: df.apply(f)

In [27]: df                                                                                                                                                                                                                
Out[27]: 
   0  1  2
0  0  0  0
1  1  1  1 

這是一個玩具示例,但是解決方案必須應用於大數據幀,因此必須快速。

干杯!

您可以通過將每個元素與該列的均值進行比較來創建數據框的布爾掩碼。 使用以下方法可以輕松實現

df > df.mean()

    0       1       2
0   False   False   False
1   True    True    True

由於True等於1,False等於0,因此可以使用astype輕松將布爾數據幀轉換為整數。

(df > df.mean()).astype(int)

    0   1   2
0   0   0   0
1   1   1   1

如果您需要輸出是一些字符串而不是0和1,請使用np.where作為條件(如果為true,則為else)

pd.DataFrame(np.where(df > df.mean(), 'm', 'n'))

    0   1   2
0   n   n   n
1   m   m   m

編輯:在評論中解決qn; 如果m和n與列相關怎么辦

df = pd.DataFrame(np.arange(12).reshape(4,3))

    0   1   2
0   0   1   2
1   3   4   5
2   6   7   8
3   9   10  11

pd.DataFrame(np.where(df > df.mean(), df.min(), df.max()))

    0   1   2
0   9   10  11
1   9   10  11
2   0   1   2
3   0   1   2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM