制作一列 STATE

Making a column of STATE

我有这样的数据-

ID     CITY     STATE     Location
1       a         b          a
1       c         w          a
2       e         b          e
2       a         f          e

我想要一个新的 STATE 列,这样当 CITY 和 Location 相同时,所有 ID 的 STATE 都是“b”。

预期输出:

ID     CITY     STATE     Location     STATE2
1       a         b          a           b
1       c         d          w           b 
2       e         m          e           m
2       u         f          e           m

使用numpy.where:

In [1724]: import numpy as np

In [1732]: x = df.loc[df.CITY == df.Location, 'STATE'].unique()[0]

In [1725]: df['STATE2'] = np.where(df.CITY == df.Location, df.STATE, x)

In [1726]: df
Out[1726]: 
   ID CITY STATE Location STATE2
0   1    a     b        a      b
1   2    c     d        a      b
2   3    e     b        a      b
3   4    a     b        a      b

解决方案 1:

df.loc[df["City"]==df["Location"],"state2"] = "b"

解决方案 2:如果您想为不匹配的行指定一个值

df.apply(lambda x: "b" if x["City"]==x["Location"] else "others",axis=1 )

方案三:如果条件比较复杂,最好使用mask

mask = (df['City']==df["Location"])
df["state3"] = df["state3"].mask(mask,"b")

请根据您要执行的操作查看两种解决方案。

解决方案 #1: 假设输入:

   ID CITY STATE Location
0   1    a     b        a
1   1    c     d        w
2   2    e     m        e
3   2    u     f        e

您可以使用 mask 更改 IDSTATE 值,其中至少有一个匹配行 CITYLocation:

m = df.loc[df['CITY'] == df['Location'], 'ID']
df['STATE 2'] = df['STATE'].mask(df['ID'].isin(m),
                                 df.groupby('ID')['STATE'].transform('first'))
df
Out[1]: 
   ID CITY STATE Location STATE 2
0   1    a     b        a       b
1   1    c     d        w       b
2   2    e     m        e       m
3   2    u     f        e       m

解决方案#2:

假设输入略有不同(该方法会根据所需的输出进行大量更改):

   ID CITY STATE Location
0   1    g     f        c
1   1    a     b        a
2   1    c     d        w
3   2    e     m        e
4   2    u     f        e

m = df.loc[df['CITY'] == df['Location']].drop_duplicates('CITY').index
df['State 2'] = np.where(df.index.isin(m), df['STATE'], np.nan)
df['State 2'] = df.groupby('ID')['State 2'].transform('first')
df
Out[2]: 
   ID CITY STATE Location State 2
0   1    g     f        c       b
1   1    a     b        a       b
2   1    c     d        w       b
3   2    e     m        e       m
4   2    u     f        e       m

此解决方案假定您希望输出是每个匹配组中的第一行。请看我的评论。希望这两个解决方案之一就是您正在寻找的。