制作一列 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
更改 ID
的 STATE
值,其中至少有一个匹配行 CITY
和 Location
:
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
此解决方案假定您希望输出是每个匹配组中的第一行。请看我的评论。希望这两个解决方案之一就是您正在寻找的。
我有这样的数据-
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
更改 ID
的 STATE
值,其中至少有一个匹配行 CITY
和 Location
:
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
此解决方案假定您希望输出是每个匹配组中的第一行。请看我的评论。希望这两个解决方案之一就是您正在寻找的。