簡體   English   中英

如何根據熊貓中另一列的多個值生成新列

[英]How to generate new column based on multiple values from another column in pandas

如何在 Pandas DataFrame 中創建一個新列,從另一列一次壓縮/折疊多個值? 另外,是否可以使用默認值,這樣您就不必顯式寫出所有值映射?

我指的是在SPSSStata等統計軟件中通常稱為“變量重新編碼”的過程。

例子

假設我有一個包含 1,000 個觀察值的 DataFrame。 DataFrame 中唯一的列稱為col1 ,它有 26 個唯一值(字母AZ )。 這是我的起點的可重現示例:

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等於ABC ,則col2應接收AA
  • 如果col1等於DEF ,則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')

也可以使用between而不是isin

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.

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