[英]How to generate new column with values based on condition in another column in pandas
[英]How to generate new column based on multiple values from another column in pandas
如何在 Pandas DataFrame 中創建一個新列,從另一列一次壓縮/折疊多個值? 另外,是否可以使用默認值,這樣您就不必顯式寫出所有值映射?
我指的是在SPSS和Stata等統計軟件中通常稱為“變量重新編碼”的過程。
假設我有一個包含 1,000 個觀察值的 DataFrame。 DataFrame 中唯一的列稱為col1
,它有 26 個唯一值(字母A
到Z
)。 這是我的起點的可重現示例:
import pandas as pd
import numpy as np
import string
np.random.seed(666)
df = pd.DataFrame({'col1':np.random.choice(list(string.ascii_uppercase),size=1000)})
我想根據以下映射創建一個名為col2
的新列:
col1
等於A
、 B
或C
,則col2
應接收AA
col1
等於D
、 E
或F
,則col2
應接收MM
col1
所有其他值, col2
應接收ZZ
我知道我可以使用 Pandas 的replace
功能部分地做到這一點,但它有兩個問題。 第一個是replace
函數不允許您將多個輸入值壓縮為一個響應值。 這迫使我寫出df['col1'].replace({'A':'AA','B':'AA','C':'AA'})
而不是像df['col1'].replace({['A','B','C']:'AA'})
這樣簡單的東西df['col1'].replace({['A','B','C']:'AA'})
。
第二個問題是replace
函數沒有all_other_values
關鍵字或類似的東西。 這迫使我手動寫出像這樣的整個值映射df['col1'].replace({'A':'AA','B':'AA',...,'G':'ZZ','H':'ZZ','I':'ZZ',...,'X':'ZZ','Y':'ZZ','Z':'ZZ'})
而不是更簡單的東西像df['col1'].replace(dict_for_abcdef, all_other_values='ZZ')
是否有另一種使用我缺少的replace
功能的方法可以讓我做我所要求的? 或者是否有另一個 Pandas 功能可以讓您完成與我上面描述的如此相似的事情?
這是我正在尋找的使用loc
的“臟”實現:
df['col2'] = 'ZZ' # Initiate the column with the default "all_others" value
df.loc[df['col1'].isin(['A','B','C']),'col2'] = 'AA' # Mapping from "A","B","C" to "AA"
df.loc[df['col1'].isin(['D','E','F']),'col2'] = 'MM' # Mapping from "D","E","F" to "MM"
我發現這個解決方案有點凌亂,並希望存在一些更清潔的東西。
可以嘗試使用np.select
,它接受條件列表、值列表和默認值:
conds = [df['col1'].isin(['A', 'B', 'C']),
df['col1'].isin(['D', 'E', 'F'])]
values = ['AA', 'MM']
df['col2'] = np.select(conds, values, default='ZZ')
conds = [df['col1'].between('A', 'C'),
df['col1'].between('D', 'F')]
values = ['AA', 'MM']
df['col2'] = np.select(conds, values, default='ZZ')
樣本輸入和輸出:
import string
import numpy as np
import pandas as pd
letters = string.ascii_uppercase
df = pd.DataFrame({'col1': list(letters)[:10]})
df
:
col1 col2
0 A AA
1 B AA
2 C AA
3 D MM
4 E MM
5 F MM
6 G ZZ
7 H ZZ
8 I ZZ
9 J ZZ
np.select(條件,選擇,替代)。 對於條件,檢查定義范圍之間的數字
c=[df['col1'].between('A','C'),df['col1'].between('E','F')]
CH=['AA','MM']
df=df.assign(col2=np.select(c,CH,'ZZ'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.