熊猫数据框操作

时间:2020-02-03 18:10:36

标签: python pandas

我是python的新手,正在尝试编写以下代码。我可以使用for循环对行进行迭代,但是可以查看是否可以向量化或不使用for循环。

Col1 Col2
ABC  A 
ABC1 B
CA   C
PU   C
XYZ  A

我想做的是: 如果Col1仅包含大写字母-然后将Col2更新为“ A” 如果Col1具有特定的字符串“ CA”或“ PU”-然后将Col2更新为“ C” 如果Col1具有字母数字值-然后将Col2更新为'B'

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

对于条件的重叠以及对它们进行优先排序的顺序,您必须非常小心。为了得到您的要求,我使用np.select

cond0 = df.Col1.str.isalpha()
cond1 = df.Col1.str.isupper()
cond2 = df.Col1.isin(['CA', 'PU'])
cond3 = df.Col1.str.isalnum()

df.assign(Col2=np.select([cond2, cond0 & cond1, cond3], ['C', 'A', 'B']))

   Col1 Col2
0   ABC    A
1  ABC1    B
2    CA    C
3    PU    C
4   XYZ    A

或使用map

def all_the_conditions(s):
    if s in {'CA', 'PU'}:
        return 'C'
    elif s.isalpha() and s.isupper():
        return 'A'
    elif s.isalnum():
        return 'B'
    else:
        return '¯\_(ツ)_/¯'

df.assign(Col2=df.Col1.map(all_the_conditions))

   Col1 Col2
0   ABC    A
1  ABC1    B
2    CA    C
3    PU    C
4   XYZ    A

答案 1 :(得分:1)

使用正则表达式就可以做到

df[df["col1"].str.contains(r"\b[A-Z]+\b", case=True)]["col2"] = "A"
df[df["col1"].isin(["CA", "PU"])]["col2"] = "C"
df[df["col1"].str.contains(".*?\d+.*?", regex=True)]["col2"] = "B"

希望这会起作用

如@walterTross所建议,我们也可以使用它

df[df["col1"].str.contains(r"^[A-Z]+$", case=True)]["col2"] = "A"
df[df["col1"].str.contains("^[A-Z0-9]$", regex=True)]["col2"] = "B"

感谢Walter:)

答案 2 :(得分:1)

这是np.select的好用例:

import numpy as np

c1 = df.Col1.str.isupper()
c2 = df.Col1.isin(['CA','PU'])
c3 = df.Col1.str.contains(r'\d')

df['Col2'] = np.select([c1 & ~(c2 | c3), c2, c3], ['A', 'C', 'B'])

print(df)

   Col1 Col2
0   ABC    A
1  ABC1    B
2    CA    C
3    PU    C
4   XYZ    A