我有一个 pandas 数据框,其中有一列名为“字母”,该列以字母表中的字母作为其值。因此第一行可能是“C”,下一行是“Z”,下一行是“M”,依此类推:
字母
C
Z
中号
一个
B
哦
...
我还有根据字母表中字母的位置对字母进行分组的列表,因此:
early_alph = ['A','B','C'....'M']
late_alph = ['N','O','P'....'Z']
我想在我的数据框中添加一个新列,根据字母表中的字母所在的列表对它们进行分组。如果这是 SQL,我会编写如下内容:
%let early_alph = ('A','B','C'....'M');
%let late_alph = ('N','O','P'....'Z');
create table my_df as
select
letters,
case when letters IN &early_alph. then 'early_alph'
when letters IN &late_alph then 'late_alph'
else 'unknown' end as 'Alph_group'
from my_table;
我想要的输出是:
字母 Alph_group
C Early_alph
Z Late_alph
中号early_alph
早期阿尔夫
B Early_alph
Olate_alph
我对 Python 和 pandas 非常陌生,但在我的研究中,Numpy 的 np.where 似乎很有前途,但我发现的每个示例都针对一个值(而不是值列表)进行测试。任何帮助将不胜感激。
最佳答案
您可以使用numpy.where
+ isin
:
import pandas as pd
import numpy as np
设置:
letters = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
df = pd.DataFrame(np.random.choice(letters, 10), columns=['letters'])
early_alph = letters[:13]
late_alph = letters[13:]
df['cat'] = np.where(df.letters.isin(early_alph), 'early_alph',
np.where(df.letters.isin(late_alph), 'late_alph', 'unkown'))
df
#letters cat
#0 B early_alph
#1 Y late_alph
#2 W late_alph
#3 U late_alph
#4 A early_alph
#5 K early_alph
#6 J early_alph
#7 C early_alph
#8 A early_alph
#9 C early_alph
或者另一个选项,从 early_alph
和 late_alph
列表创建一个字典,将 letter
映射到类别,然后使用 map
方法:
dd = dict([(early, 'early_alph') for early in early_alph] +
[(late, 'late_alph') for late in late_alph])
df['cat'] = df.letters.map(dd).fillna('unkown')
df
#letters cat
#0 B early_alph
#1 Y late_alph
#2 W late_alph
#3 U late_alph
#4 A early_alph
#5 K early_alph
#6 J early_alph
#7 C early_alph
#8 A early_alph
#9 C early_alph
关于python - 如果值位于列表中,则将条件列添加到数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46209838/