使用行值以创建其他列

时间:2019-05-07 16:26:24

标签: python pandas

我需要一些帮助才能用pandas in python

来表示我的数据框

以下是数据框:

Order   Nsp1    Nsp2    Tips    Select
Carnivora   10  10  SpA,SpB,SpC 0.7678
Carnivora   1   1   SpD NA
Carnivora   2   2   SpE,SpF 0.467103
Carnivora   4   4   SpG 0.303415

您可以看到column Tips可以有多个Spnames,我想获得一个新的数据框,例如:

Species Order   Nsp1    Nsp2    Select
SpA Carnivora   10  10  0.7678
SpB Carnivora   10  10  0.7678
SpC Carnivora   10  10  0.7678
SpD Carnivora   1   1   NA
SpE Carnivora   2   2   0.467103
SpF Carnivora   2   2   0.467103
SpG Carnivora   4   4   0.303415

Tips column消失的地方反而我用它们创建了一个新的column Species

有人有想法吗?

感谢您的帮助和时间。

1 个答案:

答案 0 :(得分:1)

首先,您必须使用this答案中的函数将Tips列拆分为行:

df = explode_str(df, 'Tips', sep=',')

print(df)
       Order  Nsp1  Nsp2 Tips    Select
0  Carnivora    10    10  SpA  0.767800
0  Carnivora    10    10  SpB  0.767800
0  Carnivora    10    10  SpC  0.767800
1  Carnivora     1     1  SpD       NaN
2  Carnivora     2     2  SpE  0.467103
2  Carnivora     2     2  SpF  0.467103
3  Carnivora     4     4  SpG  0.303415

然后,您可以将Tips + Order列中的字符串连接在一起以创建新列:

df['Species Order'] = df['Tips'] + ' ' + df['Order']
df.drop(['Order', 'Tips'], axis=1, inplace=True)
df.reset_index(inplace=True, drop=True)

print(df)
   Nsp1  Nsp2    Select  Species Order
0    10    10  0.767800  SpA Carnivora
1    10    10  0.767800  SpB Carnivora
2    10    10  0.767800  SpC Carnivora
3     1     1       NaN  SpD Carnivora
4     2     2  0.467103  SpE Carnivora
5     2     2  0.467103  SpF Carnivora
6     4     4  0.303415  SpG Carnivora

链接答案中使用的功能:

def explode_str(df, col, sep):
    s = df[col]
    i = np.arange(len(s)).repeat(s.str.count(sep) + 1)
    return df.iloc[i].assign(**{col: sep.join(s).split(sep)})