主頁 > .NET開發 > 如何根據多個條件計算多列中的值并明智地創建新列?

如何根據多個條件計算多列中的值并明智地創建新列?

2022-01-17 09:49:34 .NET開發

指數 鑰匙 M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 平均 計數_G10 計數_L10
0 一個 12 0 159 0 20 49 0 131 157 153 68.1 4 3
1 b 0 68 195 189 0 79 12 179 21 62 80.5 3 4
2 C 0 139 0 188 12 0 31 87 152 73 68.2 4 2
3 d 126 156 0 112 178 146 0 19 192 25 95.4 6 2
4 e 109 0 172 0 0 0 44 145 186 100 75.6 5 1
5 F 63 183 194 183 0 163 136 13 163 162 126 6 2
6 G 101 143 0 184 0 107 103 0 60 133 83.1 6 1
7 H 13 101 139 86 101 72 93 151 0 0 75.6 6 1
8 一世 182 71 73 73 129 32 56 135 0 114 86.5 4 5
9 j 82 0 198 0 117 21 0 32 64 146 66 4 2
10 ? 145 0 194 0 156 71 0 89 57 31 74.3 4 2

我想獲得 count_G10 和 count_L10 列,其中 count_G10 的邏輯如下: 月數(M1 到 M10 列),其中值 > 0 和((值平均值)/平均值) > 0.1

同樣,count_L10 邏輯是:月數(M1 到 M10 列),其中 value >0 并且 ((value-average)/average) < -0.1

我在 Pandas 中嘗試過以下操作:

Oct20_Nov21 = [202010,202011,202012,202101,202102,202103,202104,202105,202106,202107,202108,202109,202110,202111] 

new_df3['G10%'] = new_df3[Oct20_Nov21].applymap(lambda x : 1 if (((x-new_df3.avg_w_s)/new_df3.avg_w_s) > 0.1).any() else 0).values.sum(axis=1)

我收到以下錯誤:

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

讓我知道我在這里缺少什么。謝謝

uj5u.com熱心網友回復:

不要使用applymap,因為它非常慢,并且會嘗試對標量值和 Series 執行操作,從而導致顯示的錯誤。

相反,最好在 DataFrame 級別執行操作。

以我們可以做的最冗長的方式:

m_df = df.filter(like='M')

df['Count_G10'] = (
        m_df.gt(0) &
        m_df.sub(df['Average'], axis=0).div(df['Average'], axis=0).gt(0.1)
).sum(axis=1)

df['Count_L10'] = (
        m_df.gt(0) &
        m_df.sub(df['Average'], axis=0).div(df['Average'], axis=0).lt(-0.1)
).sum(axis=1)
鑰匙 M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 平均 計數_G10 計數_L10
一個 12 0 159 0 20 49 0 131 157 153 68.1 4 3
b 0 68 195 189 0 79 12 179 21 62 80.5 3 4
C 0 139 0 188 12 0 31 87 152 73 68.2 4 2
d 126 156 0 112 178 146 0 19 192 25 95.4 6 2
e 109 0 172 0 0 0 44 145 186 100 75.6 5 1
F 63 183 194 183 0 163 136 13 163 162 126 6 2
G 101 143 0 184 0 107 103 0 60 133 83.1 6 1
H 13 101 139 86 101 72 93 151 0 0 75.6 6 1
一世 182 71 73 73 129 32 56 135 0 114 86.5 4 5
j 82 0 198 0 117 21 0 32 64 146 66 4 2
? 145 0 194 0 156 71 0 89 57 31 74.3 4 2

首先filter只選擇 M 列(還有許多其他方法可以只選擇所需的列,它們也可以作業):

m_df = df.filter(like='M')

     M1   M2   M3   M4   M5   M6   M7   M8   M9  M10
0    12    0  159    0   20   49    0  131  157  153
1     0   68  195  189    0   79   12  179   21   62
2     0  139    0  188   12    0   31   87  152   73
3   126  156    0  112  178  146    0   19  192   25
4   109    0  172    0    0    0   44  145  186  100
5    63  183  194  183    0  163  136   13  163  162
6   101  143    0  184    0  107  103    0   60  133
7    13  101  139   86  101   72   93  151    0    0
8   182   71   73   73  129   32   56  135    0  114
9    82    0  198    0  117   21    0   32   64  146
10  145    0  194    0  156   71    0   89   57   31

然后使用比較操作gtlt做值比較操作。

第 1 步:檢查值gt0:

m_df.gt(0)

       M1     M2     M3     M4     M5     M6     M7     M8     M9    M10
0    True  False   True  False   True   True  False   True   True   True
1   False   True   True   True  False   True   True   True   True   True
2   False   True  False   True   True  False   True   True   True   True
3    True   True  False   True   True   True  False   True   True   True
4    True  False   True  False  False  False   True   True   True   True
5    True   True   True   True  False   True   True   True   True   True
6    True   True  False   True  False   True   True  False   True   True
7    True   True   True   True   True   True   True   True  False  False
8    True   True   True   True   True   True   True   True  False   True
9    True  False   True  False   True   True  False   True   True   True
10   True  False   True  False   True   True  False   True   True   True

Evaluate: ((value - average) / average). Both operations need to align on axis=0.

Step 2: Subtract

m_df.sub(df['Average'], axis=0)

      M1    M2     M3     M4     M5    M6    M7     M8     M9   M10
0  -56.1 -68.1   90.9  -68.1  -48.1 -19.1 -68.1   62.9   88.9  84.9
1  -80.5 -12.5  114.5  108.5  -80.5  -1.5 -68.5   98.5  -59.5 -18.5
2  -68.2  70.8  -68.2  119.8  -56.2 -68.2 -37.2   18.8   83.8   4.8
3   30.6  60.6  -95.4   16.6   82.6  50.6 -95.4  -76.4   96.6 -70.4
4   33.4 -75.6   96.4  -75.6  -75.6 -75.6 -31.6   69.4  110.4  24.4
5  -63.0  57.0   68.0   57.0 -126.0  37.0  10.0 -113.0   37.0  36.0
6   17.9  59.9  -83.1  100.9  -83.1  23.9  19.9  -83.1  -23.1  49.9
7  -62.6  25.4   63.4   10.4   25.4  -3.6  17.4   75.4  -75.6 -75.6
8   95.5 -15.5  -13.5  -13.5   42.5 -54.5 -30.5   48.5  -86.5  27.5
9   16.0 -66.0  132.0  -66.0   51.0 -45.0 -66.0  -34.0   -2.0  80.0
10  70.7 -74.3  119.7  -74.3   81.7  -3.3 -74.3   14.7  -17.3 -43.3

Step 3: Divide

m_df.sub(df['Average'], axis=0).div(df['Average'], axis=0)

          M1        M2        M3        M4        M5        M6        M7        M8        M9       M10
0  -0.823789 -1.000000  1.334802 -1.000000 -0.706314 -0.280470 -1.000000  0.923642  1.305433  1.246696
1  -1.000000 -0.155280  1.422360  1.347826 -1.000000 -0.018634 -0.850932  1.223602 -0.739130 -0.229814
2  -1.000000  1.038123 -1.000000  1.756598 -0.824047 -1.000000 -0.545455  0.275660  1.228739  0.070381
3   0.320755  0.635220 -1.000000  0.174004  0.865828  0.530398 -1.000000 -0.800839  1.012579 -0.737945
4   0.441799 -1.000000  1.275132 -1.000000 -1.000000 -1.000000 -0.417989  0.917989  1.460317  0.322751
5  -0.500000  0.452381  0.539683  0.452381 -1.000000  0.293651  0.079365 -0.896825  0.293651  0.285714
6   0.215403  0.720818 -1.000000  1.214200 -1.000000  0.287605  0.239471 -1.000000 -0.277978  0.600481
7  -0.828042  0.335979  0.838624  0.137566  0.335979 -0.047619  0.230159  0.997354 -1.000000 -1.000000
8   1.104046 -0.179191 -0.156069 -0.156069  0.491329 -0.630058 -0.352601  0.560694 -1.000000  0.317919
9   0.242424 -1.000000  2.000000 -1.000000  0.772727 -0.681818 -1.000000 -0.515152 -0.030303  1.212121
10  0.951548 -1.000000  1.611036 -1.000000  1.099596 -0.044415 -1.000000  0.197847 -0.232840 -0.582773

Step 4: Compare (gt or lt depending)

m_df.sub(df['Average'], axis=0).div(df['Average'], axis=0).gt(0.1)

       M1     M2     M3     M4     M5     M6     M7     M8     M9    M10
0   False  False   True  False  False  False  False   True   True   True
1   False  False   True   True  False  False  False   True  False  False
2   False   True  False   True  False  False  False   True   True  False
3    True   True  False   True   True   True  False  False   True  False
4    True  False   True  False  False  False  False   True   True   True
5   False   True   True   True  False   True  False  False   True   True
6    True   True  False   True  False   True   True  False  False   True
7   False   True   True   True   True  False   True   True  False  False
8    True  False  False  False   True  False  False   True  False   True
9    True  False   True  False   True  False  False  False  False   True
10   True  False   True  False   True  False  False   True  False  False

Step 5: Find where both conditions are True with logical AND (&)

(
        m_df.gt(0) &
        m_df.sub(df['Average'], axis=0).div(df['Average'], axis=0).gt(0.1)
)

       M1     M2     M3     M4     M5     M6     M7     M8     M9    M10
0   False  False   True  False  False  False  False   True   True   True
1   False  False   True   True  False  False  False   True  False  False
2   False   True  False   True  False  False  False   True   True  False
3    True   True  False   True   True   True  False  False   True  False
4    True  False   True  False  False  False  False   True   True   True
5   False   True   True   True  False   True  False  False   True   True
6    True   True  False   True  False   True   True  False  False   True
7   False   True   True   True   True  False   True   True  False  False
8    True  False  False  False   True  False  False   True  False   True
9    True  False   True  False   True  False  False  False  False   True
10   True  False   True  False   True  False  False   True  False  False

Step 6: Count the number of True values in each row with sum (True is 1 and False is 0 (the additive identity) which is why sum works to count number of True values)

(
        m_df.gt(0) &
        m_df.sub(df['Average'], axis=0).div(df['Average'], axis=0).gt(0.1)
).sum(axis=1)

0     4
1     3
2     4
3     6
4     5
5     6
6     6
7     6
8     4
9     4
10    4
dtype: int64

An almost identical process occurs for Count_L10 the only difference is checking .lt(-0.1) instead of .gt(0.1).


This operation can be greatly simplified by extracting and reusing common operations and refactoring the expression:

m_df = df.filter(like='M')
# Shared Condition
m = m_df.gt(0)
# Values
v = m_df.div(df['Average'], axis=0) - 1

df['Count_G10'] = (m & v.gt(0.1)).sum(axis=1)
df['Count_L10'] = (m & v.lt(-0.1)).sum(axis=1)

這兩個條件都使用檢查大于 0 的值,因此我們可以將其保存在變數 ( m) 中以多次使用。兩個運算式都與同一個運算式((值 - 平均值)/平均值)進行比較,我們也可以將其存盤在一個變數v中。

運算式 ((value - average) / average) 也可以簡化為 ((value / average) - 1)。

因為 ((v - a) / a) = ((v/a) - (a / a)) = ((v/a) - 1)

這將減少總體計算時間,但會犧牲一些可讀性,但會產生相同的結果:

鑰匙 M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 平均 計數_G10 計數_L10
一個 12 0 159 0 20 49 0 131 157 153 68.1 4 3
b 0 68 195 189 0 79 12 179 21 62 80.5 3 4
C 0 139 0 188 12 0 31 87 152 73 68.2 4 2
d 126 156 0 112 178 146 0 19 192 25 95.4 6 2
e 109 0 172 0 0 0 44 145 186 100 75.6 5 1
F 63 183 194 183 0 163 136 13 163 162 126 6 2
G 101 143 0 184 0 107 103 0 60 133 83.1 6 1
H 13 101 139 86 101 72 93 151 0 0 75.6 6 1
一世 182 71 73 73 129 32 56 135 0 114 86.5 4 5
j 82 0 198 0 117 21 0 32 64 146 66 4 2
? 145 0 194 0 156 71 0 89 57 31 74.3 4 2

使用的設定:

import pandas as pd

df = pd.DataFrame({
    'key': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'],
    'M1': [12, 0, 0, 126, 109, 63, 101, 13, 182, 82, 145],
    'M2': [0, 68, 139, 156, 0, 183, 143, 101, 71, 0, 0],
    'M3': [159, 195, 0, 0, 172, 194, 0, 139, 73, 198, 194],
    'M4': [0, 189, 188, 112, 0, 183, 184, 86, 73, 0, 0],
    'M5': [20, 0, 12, 178, 0, 0, 0, 101, 129, 117, 156],
    'M6': [49, 79, 0, 146, 0, 163, 107, 72, 32, 21, 71],
    'M7': [0, 12, 31, 0, 44, 136, 103, 93, 56, 0, 0],
    'M8': [131, 179, 87, 19, 145, 13, 0, 151, 135, 32, 89],
    'M9': [157, 21, 152, 192, 186, 163, 60, 0, 0, 64, 57],
    'M10': [153, 62, 73, 25, 100, 162, 133, 0, 114, 146, 31],
    'Average': [68.1, 80.5, 68.2, 95.4, 75.6, 126.0, 83.1, 75.6, 86.5, 66.0,
                74.3]
})

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/412432.html

標籤:

上一篇:我有一個字串“user@domain 12223334444”,我想用空格替換“ 1”。如何使用str.replace命令實作它?

下一篇:Python:Pandas資料框和for回圈-回圈體之外的單獨行變數

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more