通过分隔符pandas python拆分列

Jes*_*ica 30 python pandas

我有一个小样本数据:

import pandas as pd

df = {'ID': [3009, 129,119,120,121,122,130,3014,266,849,174,844 ],
  'V': ['IGHV7-B*01','IGHV7-B*01','IGHV6-A*01','GHV6-A*01','IGHV6-A*01','IGHV6-A*01','IGHV4-L*03','IGHV4-L*03','IGHV5-A*01','IGHV5-A*04','IGHV6-A*02','IGHV6-A*02'],
  'Prob': [1,1,0.8,0.8056,0.9,0.805 ,1,1,0.997,0.401,1,1]}


df = pd.DataFrame(df)
Run Code Online (Sandbox Code Playgroud)

好像

df    

Out[25]: 
      ID    Prob           V
0    3009  1.0000  IGHV7-B*01
1     129  1.0000  IGHV7-B*01
2     119  0.8000  IGHV6-A*01
3     120  0.8056  IGHV6-A*01
4     121  0.9000  IGHV6-A*01
5     122  0.8050  IGHV6-A*01
6     130  1.0000  IGHV4-L*03
7    3014  1.0000  IGHV4-L*03
8     266  0.9970  IGHV5-A*01
9     849  0.4010  IGHV5-A*04
10    174  1.0000  IGHV6-A*02
11    844  1.0000  IGHV6-A*02
Run Code Online (Sandbox Code Playgroud)

我想将'V'列拆分为' - '分隔符并将其移动到另一个名为'allele'的列

    Out[25]: 
      ID    Prob      V    allele
0    3009  1.0000  IGHV7    B*01
1     129  1.0000  IGHV7    B*01
2     119  0.8000  IGHV6    A*01
3     120  0.8056  IGHV6    A*01
4     121  0.9000  IGHV6    A*01
5     122  0.8050  IGHV6    A*01
6     130  1.0000  IGHV4    L*03
7    3014  1.0000  IGHV4    L*03
8     266  0.9970  IGHV5    A*01
9     849  0.4010  IGHV5    A*04
10    174  1.0000  IGHV6    A*02
11    844  1.0000  IGHV6    A*02
Run Code Online (Sandbox Code Playgroud)

我到目前为止尝试的代码是不完整的,并没有工作:

df1 = pd.DataFrame()
df1[['V']] = pd.DataFrame([ x.split('-') for x in df['V'].tolist() ])
Run Code Online (Sandbox Code Playgroud)

要么

df.add(Series, axis='columns', level = None, fill_value = None)
newdata = df.DataFrame({'V':df['V'].iloc[::2].values, 'Allele': df['V'].iloc[1::2].values})
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 58

使用vectoried str.splitexpand=True:

In [42]:
df[['V','allele']] = df['V'].str.split('-',expand=True)
df

Out[42]:
      ID    Prob      V allele
0   3009  1.0000  IGHV7   B*01
1    129  1.0000  IGHV7   B*01
2    119  0.8000  IGHV6   A*01
3    120  0.8056   GHV6   A*01
4    121  0.9000  IGHV6   A*01
5    122  0.8050  IGHV6   A*01
6    130  1.0000  IGHV4   L*03
7   3014  1.0000  IGHV4   L*03
8    266  0.9970  IGHV5   A*01
9    849  0.4010  IGHV5   A*04
10   174  1.0000  IGHV6   A*02
11   844  1.0000  IGHV6   A*02
Run Code Online (Sandbox Code Playgroud)

  • 我尝试过这个,但我想将我的栏分成三栏。df[['ColumnTable','Database','Schema','Table']] = df['ColumnTable'].str.split('.',expand=True) print(df) 我收到一条错误消息:文件“C:\Users\xxx\Anaconda3\lib\site-packages\pandas\core\frame.py”,第 3189 行,在 _setitem_array 中引发 ValueError(“列必须与键的长度相同”) ValueError:列必须相同长度作为关键 (3认同)
  • @DataGirl 我也有同样的问题。还尝试了列表理解。问题的根源是我的值由元组组成。将它们转换为字符串解决了一切。所以 `df[["x", "y"]] = df["x, y"].astype("string").str.split(", ", Expand=True)` (3认同)

Ari*_*mba 8

使用以下内容:

df['allele'] = [x.split('-')[-1] for x in df['V']]
Run Code Online (Sandbox Code Playgroud)

上述第一部分保留“-”号之后的任何值

df['V'] = [x.split('-')[-0] for x in df['V']]
Run Code Online (Sandbox Code Playgroud)

上面的第二部分保留“-”号之前的任何值并自动替换主列

df.head(3)
Run Code Online (Sandbox Code Playgroud)


Luk*_*kas 7

要将数据存储到新的数据框中,请使用相同的方法,只是将新的数据框中使用:

tmpDF = pd.DataFrame(columns=['A','B'])
tmpDF[['A','B']] = df['V'].str.split('-', expand=True)
Run Code Online (Sandbox Code Playgroud)

最终(对于我的目的,这更有用)是,如果您只需要获取字符串值的一部分(即'-'之前的文本),则可以使用.str.split(...)。str [idx],例如:

df['V'] = df['V'].str.split('-').str[0]
df
    ID      V       Prob
0   3009    IGHV7   1.0000
1   129     IGHV7   1.0000
2   119     IGHV6   0.8000
3   120     GHV6    0.8056
Run Code Online (Sandbox Code Playgroud)

-根据分隔符“-”将“ V”值拆分为列表,并将第一项存储回该列