繁体   English   中英

如何根据另一列中是否满足一组条件向 Python 中的数据框添加新列?

[英]How can I add a new column to a dataframe in Python based on whether a set of conditions are met in another column?

我想向现有数据框 df 添加一个新列“类型”:

  Circuit        Size
0    6026       Large
1    5011  Very Small
2      50       Small
3    9023  Very Small
4    85GA  Very Small
5     90A       Large

电路和大小数据类型都是对象。

如果该行的“Circuit”值是一个 4 位整数(无字母),我希望新列显示为:“1”。 如果该行的“Circuit”值包含字母表中的任何字母,我希望新列显示为:“2”。 如果该行的“Circuit”值是一个整数(无字母),但多于或少于 4 位数字,我希望新列显示为“3”。

所以结果将是:

     Circuit     Size    Type
0    6026       Large    1
1    5011  Very Small    1 
2      50       Small    3 
3    9023  Very Small    1 
4    85GA  Very Small    2 
5    90CO       Large    2

我尝试了以下方法,但它不起作用。

condition_1 = (df5["Circuit"].isdigit()) & (df5["Circuit"] >= 1000) & (df5["Circuit"] <= 9999)
condition_2 = df5["Circuit"].str.contains('[a-zA-Z]').any()
condition_3 = (df5["Circuit"].isdigit()) & (df5["Circuit"] <= 9999)

conditions = [condition_1, condition_2, condition_3]
choices = [1,2,3]
df["Type"] = np.select(conditions, choices, default="")

我应该怎么做? 谢谢你的帮助!

由于文本和数字混合使用,您最好为每个元素应用一个函数,因为正常的比较操作不起作用。 (例如:你不能做"85GA" <= 9999

def calc_type(x):
    if x.isdigit():
        if 1000 <= int(x) <= 9999:
            return 1
        return 3
    return 2
    

df['Type'] = df['Circuit'].apply(calc_type)

对于处理,这里唯一的问题是 df["Circuit"] 中的某些值是整数,有些是字符串。

更改为字符串后,您可以使用简单的单行来解决此问题:

df["Circuit"] = [str(x) for x in df["Circuit"]]
df["Type"] = [2 if any(char.isalpha() for char in circuit) else (1 if len(circuit) == 4 else 3) for circuit in df["Circuit"]]

不确定条件,但如何使用np.where并最终组合结果:

a1 = np.where(((pd.to_numeric(df["Circuit"], errors="coerce")>=1000) & (pd.to_numeric(df["Circuit"], errors="coerce")<=9999)),1,0)
a2 = np.where(df["Circuit"].str.contains('[a-zA-Z]'), 2, 0)
a3 = np.where((pd.to_numeric(df["Circuit"], errors="coerce")<=1000), 3, 0)

df["Type"] = a1 + a2 + a3

这是一种使用isupper()检查字母的方法。

l = df['Circuit'].str.len()
s = df['Circuit'].str.upper().str.isupper()

df.loc[s,'Type'] = 2
df.loc[(l.eq(4)) & (~s),'Type'] = 1
df.loc[(~l.eq(4)) & (~s),'Type'] = 3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM