将col中的唯一值替换为list-Pandas



我希望用列表中的值替换pandas-df中的唯一值。我希望使用唯一值的排序,而不是使用replace()的硬编码值。使用下面的df,我想使用lst,并在Val3中使用唯一值。因此,对于第一个唯一值使用lst[0],第二个使用lst[1]

import pandas as pd
df = pd.DataFrame({'Val1': [1, 4, 7, 10, 12, 12],
'Val2': ['12', '14', '14', '13', '15', '15'],
'Val3': ['X', 'Y', 'X', 'Y', 'Y', 'X']})
lst = ['A','B']

注:

我不能使用:

df['Val3'] = df['Val3'].replace('X','A')
df['Val3'] = df['Val3'].replace('Y','B')

因为Val3中的值会有所不同,所以我希望它是动态的。

replace获取一个列表,这样您就可以获取该系列的unique并用列表进行替换(确保列表的长度与系列中唯一值的长度匹配(:

df['Val3'] = df['Val3'].replace(df['Val3'].unique(),lst)
#or df['Val3'].replace(dict(zip(df['Val3'].unique(),lst)))

0    A
1    B
2    A
3    B
4    B
5    A
Name: Val3, dtype: object

如果可能的话,一般的解决方案是创建字典来替换不同数量的值-这里最后一个值Z没有被替换:

df = pd.DataFrame({'Val1': [1, 4, 7, 10, 12, 12],
'Val2': ['12', '14', '14', '13', '15', '15'],
'Val3': ['X', 'Y', 'X', 'Y', 'Y', 'Z']})
lst = ['A','B']
df['Val3'] = df['Val3'].replace(dict(zip(df['Val3'].unique(),lst)))
print (df)
Val1 Val2 Val3
0     1   12    A
1     4   14    B
2     7   14    A
3    10   13    B
4    12   15    B
5    12   15    Z

如果要用第一个值替换列表中的所有值,并将所有其他值替换为相同的默认值,请使用Series.mapSeries.fillna:

df = pd.DataFrame({'Val1': [1, 4, 7, 10, 12, 12],
'Val2': ['12', '14', '14', '13', '15', '15'],
'Val3': ['X', 'Y', 'X', 'Y', 'W', 'Z']})
lst = ['A','B']
df['Val3'] = df['Val3'].map(dict(zip(df['Val3'].unique(),lst))).fillna('Other')
print (df)
Val1 Val2   Val3
0     1   12      A
1     4   14      B
2     7   14      A
3    10   13      B
4    12   15  Other
5    12   15  Other

如果总是通过列表的值的数量来匹配唯一值的数量,那么性能对于numpy索引很重要——使用factorize:将lst转换为aray

lst = ['A','B']
df['Val3'] = np.array(lst)[pd.factorize(df['Val3'].to_numpy())[0]]
print (df)
Val1 Val2 Val3
0     1   12    A
1     4   14    B
2     7   14    A
3    10   13    B
4    12   15    B
5    12   15    B

最新更新