亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Pandas 中用多個唯一字符串替換重復值?

如何在 Pandas 中用多個唯一字符串替換重復值?

開滿天機 2022-07-12 17:37:29
import pandas as pdimport numpy as npdata = {'Name':['Tom', 'Tom', 'Jack', 'Terry'], 'Age':[20, 21, 19, 18]} df = pd.DataFrame(data)假設我有一個看起來像這樣的數據框。我試圖弄清楚如何檢查名稱列中的值“湯姆”,如果我第一次找到它,我將其替換為值“FirstTom”,而第二次出現時,我將其替換為值“SecondTom” . 你如何做到這一點?我之前使用過 replace 方法,但僅用于用單個值替換所有 Toms。我不想在值的末尾添加 1,而是將字符串完全更改為其他內容。編輯:如果 df 看起來更像下面這樣,我們將如何檢查第一列和第二列中的 Tom,然后用 FirstTom 替換第一個實例,用 SecondTom 替換第二個實例data = {'Name':['Tom', 'Jerry', 'Jack', 'Terry'], 'OtherName':[Tom, John, Bob,Steve]}
查看完整描述

4 回答

?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

只需添加到現有的解決方案中,您就可以使用inflect創建動態字典


import inflect

p = inflect.engine()


df['Name'] += df.groupby('Name').cumcount().add(1).map(p.ordinal).radd('_')

print(df)

        Name  Age

0    Tom_1st   20

1    Tom_2nd   21

2   Jack_1st   19

3  Terry_1st   18


查看完整回答
反對 回復 2022-07-12
?
茅侃侃

TA貢獻1842條經驗 獲得超21個贊

我們可以做的cumcount


df.Name=df.Name+df.groupby('Name').cumcount().astype(str)

df

     Name  Age

0    Tom0   20

1    Tom1   21

2   Jack0   19

3  Terry0   18

更新


suf = lambda n: "%d%s"%(n,{1:"st",2:"nd",3:"rd"}.get(n if n<20 else n%10,"th"))

g=df.groupby('Name')



df.Name=df.Name.radd(g.cumcount().add(1).map(suf).mask(g.Name.transform('count')==1,''))

df

     Name  Age

0  1stTom   20

1  2ndTom   21

2    Jack   19

3   Terry   18

更新 2 列


suf = lambda n: "%d%s"%(n,{1:"st",2:"nd",3:"rd"}.get(n if n<20 else n%10,"th"))


g=s.groupby([s.index.get_level_values(0),s])

s=s.radd(g.cumcount().add(1).map(suf).mask(g.transform('count')==1,''))

s=s.unstack()

     Name OtherName

0  1stTom    2ndTom

1   Jerry      John

2    Jack       Bob

3   Terry     Steve


查看完整回答
反對 回復 2022-07-12
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

編輯:對于每行重復的計數,請使用:


df = pd.DataFrame(data = {'Name':['Tom', 'Jerry', 'Jack', 'Terry'], 

                          'OtherName':['Tom', 'John', 'Bob','Steve'],

                          'Age':[20, 21, 19, 18]})


print (df)

    Name OtherName  Age

0    Tom       Tom   20

1  Jerry      John   21

2   Jack       Bob   19

3  Terry     Steve   18


import inflect

p = inflect.engine()


#map by function for dynamic counter

f = lambda i: p.number_to_words(p.ordinal(i))

#columns filled by names

cols = ['Name','OtherName']

#reshaped to MultiIndex Series

s = df[cols].stack()

#counter per groups

count = s.groupby([s.index.get_level_values(0),s]).cumcount().add(1)

#mask for filter duplicates

mask = s.reset_index().duplicated(['level_0',0], keep=False).values

#filter only duplicates and map, reshape back and add to original data

df[cols] = count[mask].map(f).unstack().add(df[cols], fill_value='')

print (df)

       Name  OtherName  Age

0  firstTom  secondTom   20

1     Jerry       John   21

2      Jack        Bob   19

3     Terry      Steve   18

使用GroupBy.cumcountwith Series.map,但僅適用于重復值 by Series.duplicated:


data = {'Name':['Tom', 'Tom', 'Jack', 'Terry'], 'Age':[20, 21, 19, 18]} 

df = pd.DataFrame(data)


nth = {

0: "First",

1: "Second",

2: "Third",

3: "Fourth"

}


mask = df.Name.duplicated(keep=False)

df.loc[mask, 'Name'] = df[mask].groupby('Name').cumcount().map(nth) + df.loc[mask, 'Name']

print (df)

        Name  Age

0   FirstTom   20

1  SecondTom   21

2       Jack   19

3      Terry   18

動態字典應該是這樣的:


import inflect

p = inflect.engine()


mask = df.Name.duplicated(keep=False)

f = lambda i: p.number_to_words(p.ordinal(i))

df.loc[mask, 'Name'] = df[mask].groupby('Name').cumcount().add(1).map(f) + df.loc[mask, 'Name']

print (df)


        Name  Age

0   firstTom   20

1  secondTom   21

2       Jack   19

3      Terry   18


查看完整回答
反對 回復 2022-07-12
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

transform

nth = ['First', 'Second', 'Third', 'Fourth']


def prefix(d):

    n = len(d)

    if n > 1:

        return d.radd([nth[i] for i in range(n)])

    else:

        return d


df.assign(Name=df.groupby('Name').Name.transform(prefix))


          Name  Age

0     FirstTom   20

1    SecondTom   21

2         Jack   19

3        Terry   18

4   FirstSteve   17

5  SecondSteve   16

6   ThirdSteve   15


查看完整回答
反對 回復 2022-07-12
  • 4 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號