将行拆分为新行并从其他列添加相应的匹配值

时间:2017-07-20 11:58:19

标签: python pandas dataframe

我有一个像

这样的数据农场
  data = pd.DataFrame({'Name': ['CTA15;CTA16;CAR;', 'AC007;AC008;GOO7;G008;F009', 'AC09;BC09;C09;V09;B0P', 'UF09;GF09;HF09;MN08'],  
    'Sample':['JAK_1', 'TOR2', 'Gilo', 'ALR']})
data

                Name    Sample
0   CTA15;CTA16;CAR;           JAK_1
1   AC007;AC008;GOO7;G008;F009  TOR2
2   AC09;BC09;C09;V09;B0P       Gilo
3   UF09;GF09;HF09;MN08         ALR

我需要将列名称拆分为一个新行并相应地在Sample列中添加值。最后,我的目标是拥有这样的数据框,

    Name    Sample
0   CTA15   JAK_1
1   CTA16   JAK_1
2   CAR JAK_1
3   AC007   TOR2
4   AC008   TOR2
5   GOO7    TOR2
6   G008    TOR2
7   F009    TOR2
8   AC09    Gilo
9   BC09    Gilo
10  C09 Gilo
11  V09 Gilo
12  B0P Gilo
13  UF09    ALR
14  GF09    ALR
15  HF09    ALR
16  MN08    ALR

我需要与';'分开进入新行并将Sample列中的值相应地添加到每个行中。

1 个答案:

答案 0 :(得分:3)

您可以使用str.strip在某些字符串的结尾处删除;list添加str.split,然后length获取len他们。

上次使用numpy.repeatnumpy.concatenate DataFrame constructor创建新的vals = data['Name'].str.strip(';').str.split(';') l = vals.str.len() df = pd.DataFrame({'Sample':np.repeat(data['Sample'].values, l), 'Name':np.concatenate(vals.values)}) print (df) Name Sample 0 CTA15 JAK_1 1 CTA16 JAK_1 2 CAR JAK_1 3 AC007 TOR2 4 AC008 TOR2 5 GOO7 TOR2 6 G008 TOR2 7 F009 TOR2 8 AC09 Gilo 9 BC09 Gilo 10 C09 Gilo 11 V09 Gilo 12 B0P Gilo 13 UF09 ALR 14 GF09 ALR 15 HF09 ALR 16 MN08 ALR

df = data.join(data.pop('Name')
                   .str.strip(';')
                   .str.split(';', expand=True)
                   .stack()
                   .reset_index(level=1, drop=True)
                   .rename('Name')).reset_index(drop=True)
print (df)
   Sample   Name
0   JAK_1  CTA15
1   JAK_1  CTA16
2   JAK_1    CAR
3    TOR2  AC007
4    TOR2  AC008
5    TOR2   GOO7
6    TOR2   G008
7    TOR2   F009
8    Gilo   AC09
9    Gilo   BC09
10   Gilo    C09
11   Gilo    V09
12   Gilo    B0P
13    ALR   UF09
14    ALR   GF09
15    ALR   HF09
16    ALR   MN08

替代解决方案:

if [[ condition ]]
then do something
fi