我的数据框如下所示。 DF:
col_1 col_2
EDU facebook
EDU google
EDU google_usa
EDU tabula
EDU xyz
EDU abc
IAR facebook
IAR google
如果col_1
有EDU'和col_2有'facebook', 'google'
new_col应该有相同的字符串,facebook and google
,如果col_2包含'google_usa',tabula'
,new_col应该包含' gusa'如果col_2有任何其他字符串,ne_col应该在同一数据框中有others
。
如果col_1
有' IAR'而col_2
有'facebook'
,new_col应该有facebook,而col_2
中的任何其他字符串都应该包含'other'
在相同的数据框中。
预期产出:
col_1 col_2 new_col
EDU facebook facebook
EDU google google
EDU google_usa gusa
EDU tabula gusa
EDU xyz others
EDU abc others
IAR facebook facebook
IAR google others
我尝试了以下代码,但没有解决。请在这方面帮助我。 提前谢谢。
if df['col_1'].str.contains('EDU').any():
df['new_col'] = ['facebook' if 'facebook' in x else
'google' if 'google' == x else
'gcusa_tb' if 'taboola' in x else
'gcusa_tb' if 'google_cusa' in x else
'Others' for x in df['col_2']]
答案 0 :(得分:1)
is_edu = df.col_1 == 'EDU'
g_or_f = df.col_2.isin(['google', 'facebook'])
g_or_t = df.col_2.isin(['google_usa', 'tabula'])
is_iar = df.col_1 == 'IAR'
is_fac = df.col_2 == 'facebook'
df.assign(
new_col=np.where(
is_edu,
np.where(
g_or_f, df.col_2,
np.where(g_or_t, 'gusa', 'other')
),
np.where(
is_iar & is_fac, 'facebook', 'other'
)
)
)
col_1 col_2 new_col
0 EDU facebook facebook
1 EDU google google
2 EDU google_usa gusa
3 EDU tabula gusa
4 EDU xyz other
5 EDU abc other
6 IAR facebook facebook
7 IAR google other
答案 1 :(得分:1)
我会使用一些numpy命令:
df['new_col'] = 'others'
df.loc[np.logical_and(df.col_1=='EDU', np.in1d(df.col_2, ['facebook','google'])), 'new_col'] = df.loc[np.logical_and(df.col_1=='EDU', np.in1d(df.col_2, ['facebook','google'])), 'col_2']
df.loc[np.logical_and(df.col_1=='EDU', np.in1d(df.col_2, ['google_usa','tabula'])), 'new_col'] = 'gusa'
P.S。您的请求与您提出的输出不完全一致,我希望我已正确解释了请求。我的代码会输出:
col_1 col_2 new_col
0 EDU facebook facebook
1 EDU google google
2 EDU google_usa gusa
3 EDU tabula gusa
4 EDU xyz others
5 EDU abc others
6 IAR facebook others
7 IAR google others
答案 2 :(得分:0)
我相信这是了解代码如何工作的最简单方法,以便您可以将其应用于更多情况,而不仅仅是这个示例。这很直观。您可以随时添加逻辑。
1)首先我们创建一个函数
2)应用所述功能
def new_col(col):
if col['col1'] == 'EDU' and col['col2'] == 'facebook':
return 'facebook'
if col['col1'] == 'EDU' and col['col2'] == 'google':
return 'google'
if col['col2'] == 'google_usa' or col['col2'] == 'tabula':
return 'gusa'
if col['col1'] == 'IAR' and col['col2'] == 'facebook':
return 'facebook'
return 'others'
df['new_col'] = df.apply(lambda col: new_col (col),axis=1)
输出(我的col1和col2是向后的。不介意这一点。我这样阅读起来更容易):
col2 col1 new_col
0 facebook EDU facebook
1 google EDU google
2 google_usa EDU gusa
3 tabula EDU gusa
4 xyz EDU others
5 abc EDU others
6 facebook IAR facebook
7 google IAR others