我想你需要apply
与join
和删除NaN
通过dropna
:
df['attackers'] = df[['attacker_1','attacker_2','attacker_3','attacker_4']] \
.apply(lambda x: '/'.join(x.dropna()), axis=1)
print (df)
attacker_1 attacker_2 attacker_3 attacker_4 attackers
0 Lannister NaN NaN NaN Lannister
1 NaN Stark greyjoy NaN Stark/greyjoy
如果需要separator
空字符串使用DataFrame.fillna
:
df['attackers'] = df[['attacker_1','attacker_2','attacker_3','attacker_4']].fillna('') \
.apply(''.join, axis=1)
print (df)
attacker_1 attacker_2 attacker_3 attacker_4 attackers
0 Lannister NaN NaN NaN Lannister
1 NaN Stark greyjoy NaN Starkgreyjoy
另2个解决方案list comprehension
- 首先由notnull
比较和第二次检查,如果string
:
df['attackers'] = df[['attacker_1','attacker_2','attacker_3','attacker_4']] \
.apply(lambda x: '/'.join([e for e in x if pd.notnull(e)]), axis=1)
print (df)
attacker_1 attacker_2 attacker_3 attacker_4 attackers
0 Lannister NaN NaN NaN Lannister
1 NaN Stark greyjoy NaN Stark/greyjoy
#python 3 - isinstance(e, str), python 2 - isinstance(e, basestring)
df['attackers'] = df[['attacker_1','attacker_2','attacker_3','attacker_4']] \
.apply(lambda x: '/'.join([e for e in x if isinstance(e, str)]), axis=1)
print (df)
attacker_1 attacker_2 attacker_3 attacker_4 attackers
0 Lannister NaN NaN NaN Lannister
1 NaN Stark greyjoy NaN Stark/greyjoy
完美解决方案!谢谢。如果轴= 0,则在列应用功能上的“轴”的线可以展开,按照文件,如果= 1,那么它是在该行申请轴,就可以解释如何在这里工作? –
就像您在评论中所说的一样。您可以通过'DF [ 'attacker_1', 'attacker_2', 'attacker_3', 'attacker_4']]进行测试。适用(打印)'和'DF [ 'attacker_1', 'attacker_2', 'attacker_3',” attacker_4']]。apply(print,axis = 1)' – jezrael
让我试着解释我迄今为止所知道的,当我使用4列的子集并使用apply来应用函数时,'lambda x'是可迭代子集中的所有行,这里应用的函数是'一个字符串“/”与在每行上应用的dropna连接,并且这是使用axis = 1指定的。这是正确的还是我错过了什么 –