如何通过使用python比较同一数据帧中的两列来创建新列?

时间:2017-03-20 16:38:38

标签: python python-3.x pandas jupyter-notebook

我的数据框如下所示。 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']]

3 个答案:

答案 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