熊猫根据索引向“数据框”列添加值,如果值存在,则追加

时间:2019-08-27 07:13:20

标签: python pandas

我正在根据索引值将值分配给列,如果值存在,则将新值附加到旧值

我尝试根据索引将值应用于列,但是无法将值附加到列中已经存在的值

数据框:-

    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     

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