我的数据框中有一列如下所示:
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
答案 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)
您可以执行以下操作:
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})