我正在根据索引值将值分配给列,如果值存在,则将新值附加到旧值
我尝试根据索引将值应用于列,但是无法将值附加到列中已经存在的值
数据框:-
foo bar
0 1 1
1 2 2
2 3 3
3 3 3
代码:-
values = ['a', 'b']
for val in values:
df.loc[df['foo'] == 1, foo2] = val
Outupt数据框:
foo bar foo2
0 1 1 b
1 2 2
2 3 3
3 3 3
预期的DataFrame:-
foo bar foo2
0 1 1 a,b
1 2 2
2 3 3
3 3 3
答案 0 :(得分:1)
您注意到了这一行
df.loc[df['foo'] == 1, foo2] = b
会覆盖先前的值,因此最终只能使用b
。您是否需要通过这种特定方式解决问题?您可以编写一个自定义函数,并使用apply附加值,但这不是应该使用pandas的方式。
我建议创建另一列'foo3'
。之后,您始终可以加入字母。
答案 1 :(得分:0)
这应该可以实现您想要的。但是,正如maow已经指出的那样,您应该考虑添加新列,并在需要时将它们串联起来。
import pandas as pd
df = pd.DataFrame({'foo': [1,2,3,3], 'bar': [1,2,3,3], 'foo2':[None, None, None, None]})
print(df)
a = 'a'
b = 'b'
# insert a
df.loc[df['foo'] == 1, 'foo2'] = a
print(df)
# concat b to a
df.loc[df['foo'] == 1, 'foo2'] += ',' + b
print(df)
答案 2 :(得分:0)
这应该可以解决您的问题
import pandas as pd
df = pd.DataFrame({'foo': [1,2,3,3], 'bar': [1,2,3,3], 'foo2':[None, None, None, None]})
print(df)
print(df)
values = ['a', 'b']
for val in values:
print(df.loc[df['foo'] == 1,'foo2'][0])
if (df.loc[df['foo'] == 1,'foo2'][0]==None):
df.loc[df['foo'] == 1, 'foo2']=val
else:
df.loc[df['foo'] == 1, 'foo2']=df.loc[df['foo'] == 1:,'foo2'] + ',' +val
print(df)
输出:
foo bar foo2
0 1 1 a,b
1 2 2
2 3 3
3 3 3