簡體   English   中英

在熊貓的多列中替換整數值范圍

[英]Replace a range of integer values in multiple columns of Pandas

我有以下數據框:

Index ColA ColB ColC ColD 
0       1    4   13   ABC
1       12   1   24   ABC
2       36   18  1    ABC
3       41   45  1    ABC

現在,我正在尋找一個簡單的命令來轉換pandas df,使ColA,ColB和ColC的值如下所示:

for each row:
   if value in ColA <= 12 then 1
   if value in ColA > 12 and <= 24 then 2
   if value in ColA > 24 and <= 36 then 3
   if value in ColA > 36 then 4

(其他列也一樣)

因此結果將如下所示:

Index ColA ColB ColC ColD 
0       1    1   2    ABC
1       1    1   2    ABC
2       3    2   1    ABC
3       4    4   1    ABC

有沒有簡單的方法可以做到這一點? :-)

最好的問候,安德烈

您可以使用熊貓提供的功能來解決此問題。

基本上,您可以遍歷所有列,並使用pandas數據框提供的功能將范圍內的列的所有值更改為新值。

import pandas as pd
import numpy as np

df = pd.DataFrame()

df["ColA"] = [1, 12, 32, 24]
df["ColB"] = [23, 11, 6, 45]
df["ColC"] = [10, 25, 3, 23]

print(df)

輸出:

   ColA  ColB  ColC
0     1    23    10
1    12    11    25
2    32     6     3
3    24    33    23

現在,我們將使用代碼df['ColA'].between(0,12)查找具有給定范圍內值的列的所有索引,並使用代碼df['ColA'].between(0,12)為此列分配這些索引的新值df.loc[df['ColA'].between(0,12), 'ColA'] = 1

這是為ColA完成的,現在要對數據幀的所有列執行此操作,我們將使用循環,可以使用以下代碼完成此操作。

for col in df.columns:
    df.loc[df[col].between(0,12), col] = 1
    df.loc[df[col].between(13,24), col] = 2
    df.loc[df[col].between(25,36), col] = 3

print(df)

輸出:

   ColA  ColB  ColC
0     1     2     1
1     1     1     3
2     1     1     1
3     1     3     2

numpy.select一般解決方案:

cols = ['ColA','ColB','ColC']
m1 = df[cols] <= 12
m2 = df[cols] <= 24
m3 = df[cols] <= 36

df[cols] = np.select([m1, m2, m3], [1,2,3], default=4)
print (df)
   ColA  ColB  ColC ColD
0     1     1     2  ABC
1     1     1     2  ABC
2     3     2     1  ABC
3     4     4     1  ABC

如果alwyas需要根據您的條件提供[1,2,3,4]值的另一種解決方案:

減去1並使用12整數除法,最后加上1 ,還添加了DataFrame.clip來設置超出閾值的最小和最大值:

cols = ['ColA','ColB','ColC']

df[cols] = (df[cols].clip(lower=1, upper=37) - 1) // 12 + 1

暫無
暫無

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

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