2014-09-19 93 views
0

我有以下阵列:Python的大熊猫:改变一列基于其他动态

Key, Value 

Up, a 
Up, b 
Up, b_regen 
Up, c_regen 
Down, a 
Down, b 
Down, b_regen 
Down, c 

其中value == * _regen变化键(按键)_regen *是通配符

输出将是:

Up, a 
Up, b 
Up_regen, b_regen 
Up_regen, c_regen 
Down, a 
Down, b 
Down, c 
Down_regen, b_regen 

我有这个迄今为止得到:

x = df['Key'].values[df['Values'].values == 'b_regen'] = 'Up_regen' 

这可行,但它不是动态的。我需要上/下_regen部分不被硬编码如上。 理想情况下,'b_regen'值也不会被硬编码,并会查找其中包含'_regen'的任何变量。不过,我认为如果将它变成函数,我可以得到解决方法。

回答

2

如果你有一个DataFrame这样的:

a = pandas.DataFrame([['Up', 'a'], ['Up', 'a_regen'], ['Down', 'b_regen']], columns=['key', 'value']) 
>>> a 
    key value 
0 Up  a 
1 Up a_regen 
2 Down b_regen 

您可以创建一个确定的值列在'_regen'结束,然后应用它的值的函数:

def is_regen(s): 
    return s[-5:] == '_regen' 

然后只需添加字符串到您的密钥的末尾:

a.loc[a['value'].apply(is_regen), 'key'] += '_regen' 
>>> a 
      key value 
0   Up  a 
1 Up_regen a_regen 
2 Down_regen b_regen 
+0

您是否知道如果可能se这样可以将def is_regen函数中的'_regen'作为变量传递给硬编码? – 2014-09-19 17:26:25

+1

当然,你的函数只需要2个参数,'def has_substring(s,end):return s [-len(end):] == end' – Mike 2014-09-19 17:51:34

+0

是的,但是如何在apply函数中真正传递参数。你不能简单地使用a.loc [a ['value']。apply(has_substring(s,“regen”)),'key'] + ='_regen'。在apply函数中,参数通过“args =”参数传递,就像这样a.loc [a ['value']。apply(func = has_substring args =“regen”,'key'] + ='_regen' – 2014-09-19 18:30:46