根据其他列中包含的字符串为列分配条件值
Assign column with conditional values based on strings contained in other columns
我正在尝试根据可能包含在其他列中的字符串来分配列。例如
var1 = 67
columns = {'col1': ['string1', 'thang2', 'code3', 'string2'],
'col2': [1, 2, np.nan, 3], 'col3': ['I', 'cant', 'think', 'what']}
df = pd.DataFrame(data = columns)
然后我如何制作第四列 col4
大多数时候是 col3 + var1 + col1
,但是当 col2
是 nan
时是 np.nan
(在同一行中)并且只要 col1
中的任何字符串中有 'in'
(同样,在同一行中),就会在其值后附加一个 -W
?
我对 assign
了如指掌,但我不知道如何在分配中执行所有这些条件操作,或者如果有办法在创建列后执行此操作,我不知道当然可以。
您可以尝试使用 np.where
:
df['col4'] = np.where(df['col2'].notnull(),
df['col3'] + str(var1) + np.where(df['col1'].str.contains('in'),
df['col1'] + '-w',
df['col1']),
np.nan)
输出:
col1 col2 col3 col4
0 string1 1.0 I I67string1-w
1 thang2 2.0 cant cant67thang2
2 code3 NaN think NaN
3 string2 3.0 what what67string2-w
或者如果你想用 assign
:
df.assign(col5 = np.where(df['col2'].notnull(),
df['col3'] + str(var1) + np.where(df['col1'].str.contains('in'),
df['col1'] + '-w',
df['col1']),
np.nan))
输出:
col1 col2 col3 col4 col5
0 string1 1.0 I I67string1-w I67string1-w
1 thang2 2.0 cant cant67thang2 cant67thang2
2 code3 NaN think NaN NaN
3 string2 3.0 what what67string2-w what67string2-w
更新:既然你提到了速度。我想我会删除 .str 访问器并也使用列表理解。
df['col4'] = np.where(df['col2'].notnull(),
df['col3'] + str(var1) + np.where(['in' in i for i in df['col1']],
df['col1'] + '-w',
df['col1']),
np.nan)
我正在尝试根据可能包含在其他列中的字符串来分配列。例如
var1 = 67
columns = {'col1': ['string1', 'thang2', 'code3', 'string2'],
'col2': [1, 2, np.nan, 3], 'col3': ['I', 'cant', 'think', 'what']}
df = pd.DataFrame(data = columns)
然后我如何制作第四列 col4
大多数时候是 col3 + var1 + col1
,但是当 col2
是 nan
时是 np.nan
(在同一行中)并且只要 col1
中的任何字符串中有 'in'
(同样,在同一行中),就会在其值后附加一个 -W
?
我对 assign
了如指掌,但我不知道如何在分配中执行所有这些条件操作,或者如果有办法在创建列后执行此操作,我不知道当然可以。
您可以尝试使用 np.where
:
df['col4'] = np.where(df['col2'].notnull(),
df['col3'] + str(var1) + np.where(df['col1'].str.contains('in'),
df['col1'] + '-w',
df['col1']),
np.nan)
输出:
col1 col2 col3 col4
0 string1 1.0 I I67string1-w
1 thang2 2.0 cant cant67thang2
2 code3 NaN think NaN
3 string2 3.0 what what67string2-w
或者如果你想用 assign
:
df.assign(col5 = np.where(df['col2'].notnull(),
df['col3'] + str(var1) + np.where(df['col1'].str.contains('in'),
df['col1'] + '-w',
df['col1']),
np.nan))
输出:
col1 col2 col3 col4 col5
0 string1 1.0 I I67string1-w I67string1-w
1 thang2 2.0 cant cant67thang2 cant67thang2
2 code3 NaN think NaN NaN
3 string2 3.0 what what67string2-w what67string2-w
更新:既然你提到了速度。我想我会删除 .str 访问器并也使用列表理解。
df['col4'] = np.where(df['col2'].notnull(),
df['col3'] + str(var1) + np.where(['in' in i for i in df['col1']],
df['col1'] + '-w',
df['col1']),
np.nan)