根据另一列更改熊猫列

时间:2019-03-20 11:05:09

标签: python pandas for-loop conditional multiple-columns

我有一个熊猫DataFrame,其中包含如下内容:

A         A_type
"Hello"   String
15        Integer
"Hi"      String
56.78     Float

我想创建第三列,如果A具有名为“ String”的对应“ A_type”元素,则报告与A相同的值,否则打印“空白”。该列如下所示:

B
"Hello"
"blank"
"Hi"
"blank"

我尝试做类似的事情:

df['B'] = df['A']
for j in df['A_type']:
    for i in df['B']:
            if j == "String":
                i = i
            else:
                i = "blank"

有没有更有效的方法来解决此类问题,从而帮助我避免所有这些for循环?

非常感谢

3 个答案:

答案 0 :(得分:2)

使用Series.whereSeries.mask处于颠倒状态,或numpy.where

df['B'] = df['A'].where(df['A_type'] == "String", 'blank')
#df['B'] = df['A'].mask(df['A_type'] != "String", 'blank')
#alternative
#df['B'] = np.where(df['A_type'] == "String", df['A'], 'blank')
print (df)
       A   A_type      B
0  Hello   String  Hello
1     15  Integer  blank
2     Hi   String     Hi
3  56.78    Float  blank

答案 1 :(得分:0)

df['B']=df['A'].copy()
df.loc[df['A_type']!="String", 'B'] = "blank"

O / P:

       A  A_type      B
0  Hello  String  Hello
1  blank   blank  blank
2     Hi  String     Hi
3  blank   blank  blank

说明:

  1. 复制Col A
  2. 仅将值更新为blank而不是A_Type的{​​{1}}

答案 2 :(得分:0)

还可以尝试:

df['B'] = df.apply(lambda x: x['A'] if x['A_type'] == 'String' else "Blank", axis = 1)