如何通过遍历现有列的值来创建新列?

时间:2019-03-05 14:25:39

标签: python pandas dataframe

我的数据框中有一列如下所示:

ContextID
7289972
7289972
7289972
7289973
7289973
7304693
7304693
7304693

我正在尝试根据此ContextID列创建一个新列,如下所示:

    ContextID     Name
    7289972   Gas_basics
    7289972   Gas_basics
    7289972   Gas_basics
    7289973   Plasma_basics
    7289973   Plasma_basics
    7304693   DC2
    7304693   DC2
    7304693   DC2

我尝试了以下代码

ID = data.ContextID.tolist()
print(ID)

for id in ID:
    if (ID == '7289972'):
        data['Strategyname'] = 'Plasma_basics'
    elif(ID == '7289973'):
        data['Strategyname'] = 'Gas_basics'
    elif(ID == '7304693'):
        data['Strategyname'] = 'DC2'

但这只是创建一个名为id且类型为int且大小为1的变量,其值为7304693。

最后,我想将名为Strategyname的这个新生成的列添加到名为data的主数据框中。

谁能告诉我我在做什么错,以便我可以更好地了解自己的错误并帮助我克服这个问题?

谢谢

编辑1:

我有2095个唯一的ContextID,它们分别属于3种:Gas_basics,Plasma_basics,DC2之一

示例:

contextid   strategyname
7289971         DC2
7289972     Plasma_basics
7289973      Gas_basics
7289997         DC2
7289998     Plasma_basics
7289999      Gas_basics
7289972     Plasma_basics
7289973      Gas_basics
7304693         DC2

4 个答案:

答案 0 :(得分:2)

如果您的DataFrame带有字典:

s = """
ContextID,Name
7289972,Gas_basics
7289973,Plasma_basics
7304693,DC_Only
"""
df = pd.read_csv(pd.compat.StringIO(s), sep=',')
df

您可以将其转换为python dict,然后使用pandas map函数应用于您的数据集(有关map的更多信息,请访问https://pandas.pydata.org/pandas-docs/version/0.23.3/generated/pandas.Series.map.html):

d = dict(df.values)
df['NewName'] = df['ContextID'].map(d)
df

输出:

    ContextID   Name    NewName
0   7289972 Gas_basics  Gas_basics
1   7289972 Gas_basics  Gas_basics
2   7289972 Gas_basics  Gas_basics
3   7289973 Plasma_basics   Plasma_basics
4   7289973 Plasma_basics   Plasma_basics
5   7304693 DC_Only DC_Only
6   7304693 DC_Only DC_Only
7   7304693 DC_Only DC_Only

答案 1 :(得分:1)

np.select用于矢量化方法:

df['Name']=np.select([df.ContextID.eq(7289972),df.ContextID.eq(7289973),\
                  df.ContextID.eq(7304693)],['Plasma_basics','Gas_basics','DC_Only'])
print(df)

   ContextID           Name
0    7289972  Plasma_basics
1    7289972  Plasma_basics
2    7289972  Plasma_basics
3    7289973     Gas_basics
4    7289973     Gas_basics
5    7304693        DC_Only
6    7304693        DC_Only
7    7304693        DC_Only

答案 2 :(得分:0)

结帐df.apply()

您可以执行以下操作:

def myfunc(x):
    if x==1:
        return 'hello'
    else:
        return 'world'
df = pd.DataFrame([1, 1, 1, 2, 2, 2], columns=['A'])
df['B'] = df['A'].apply(myfunc)

   A      B
0  1  hello
1  1  hello
2  1  hello
3  2  world
4  2  world
5  2  world

答案 3 :(得分:0)

您可以使用DataFrame.merge:

data="""
ContextID
7289972
7289972
7289972
7289973
7289973
7304693
7304693
7304693
"""
df1 = pd.read_csv(pd.compat.StringIO(data), sep='\s+',dtype={'ContextID' : str})

df2 = pd.DataFrame({'ContextID': ['7289972','7289973','7304693'],
                    'Name': ['Plasma_basics','Gas_basics','DC2']})
print(df1.merge(df2.drop_duplicates(), how='right',  on=['ContextID']))

输出:

  ContextID           Name
0   7289972  Plasma_basics
1   7289972  Plasma_basics
2   7289972  Plasma_basics
3   7289973     Gas_basics
4   7289973     Gas_basics
5   7304693            DC2
6   7304693            DC2
7   7304693            DC2

您也可以使用csv文件或文本来设置输入内容:

data1 ="""
ContextID Name
7289972 Plasma_basics
7289973 Gas_basics
7304693 DC2
"""

df1 = pd.read_csv(pd.compat.StringIO(data1), sep='\s+',dtype={'ContextID' : str})